当前位置: 首页 > 知识库问答 >
问题:

使用spring数据elasticsearch和搜索相似文档,如何获得相似性分数?

张成济
2023-03-14

我正在使用最新版本的elasticsearch(在docker中)和spring boot(最新版本)应用程序,试图在其中搜索类似的文档。我的文档类有一个字符串字段:

@Field(
        name = "description",
        type = FieldType.Text,
        fielddata = true,
        analyzer = "icu_analyzer",
        termVector = TermVector.with_positions_offsets,
        similarity = Similarity.BM25)
private String description;

当我使用内置的search ch相似方法时,我的查询得到了很多结果:

public Page<BookInfo> findSimilarDocuments(final long id) {
    return bookInfoRepository.findById(id)
            .map(bookInfo -> bookInfoRepository.searchSimilar(bookInfo, new String[]{"description"}, pageable))
            .orElse(Page.empty());
}

然而,我不知道这些文档有多相似,因为它只是我的文档对象的一个页面。在执行查询时,能够看到相似性分数或设置相似性阈值将非常棒。我应该做些不同的事情吗?

共有1个答案

赖杰
2023-03-14

我刚刚看了一下,现有的方法页面

public Page<T> searchSimilar(T entity, @Nullable String[] fields, Pageable pageable) {

    Assert.notNull(entity, "Cannot search similar records for 'null'.");
    Assert.notNull(pageable, "'pageable' cannot be 'null'");

    MoreLikeThisQuery query = new MoreLikeThisQuery();
    query.setId(stringIdRepresentation(extractIdFromBean(entity)));
    query.setPageable(pageable);

    if (fields != null) {
        query.addFields(fields);
    }

    SearchHits<T> searchHits = execute(operations -> operations.search(query, entityClass, getIndexCoordinates()));
    SearchPage<T> searchPage = SearchHitSupport.searchPageFor(searchHits, pageable);
    return (Page<T>) SearchHitSupport.unwrapSearchHits(searchPage);
}

您可以实现自定义存储库片段(请参见https://docs.spring.io/spring-data/elasticsearch/docs/4.2.6/reference/html/#repositories.custom-实现),它提供了返回搜索页面的方法的自身实现

public SearchPage<T> searchSimilar(T entity, @Nullable String[] fields, Pageable pageable) {

    Assert.notNull(entity, "Cannot search similar records for 'null'.");
    Assert.notNull(pageable, "'pageable' cannot be 'null'");

    MoreLikeThisQuery query = new MoreLikeThisQuery();
    query.setId(stringIdRepresentation(extractIdFromBean(entity)));
    query.setPageable(pageable);

    if (fields != null) {
        query.addFields(fields);
    }

    SearchHits<T> searchHits = execute(operations -> operations.search(query, entityClass, getIndexCoordinates()));
    SearchPage<T> searchPage = SearchHitSupport.searchPageFor(searchHits, pageable);
    return searchPage;
}

一个搜索页面

 类似资料:
  • 有没有办法在elasticsearch中查询一组术语的相似性(匹配分数)? 简单的例子: 数据: 查询: 后果 说明:doc1包含搜索中存在的所有标记。doc2包含搜索中存在的3个标记中的2个 所以基本上查询将返回按匹配排序的文档列表,其中匹配=文档中的标签与查询中的标签有多相似。不需要模糊性。返回%只是一个例子,返回点或其他单位就可以了。标签的数量可以不同。 我正在设计系统,因此可以以任何格式存

  • 问题内容: 好了,在整日努力梳理头发之后,我决定从社区中获取一些建议。 应该提到的是,我对Elasticsearch还是相当陌生。 我的想法是,我有一个包含一些文档的ES索引,并且仅当尚未索引具有相似字段内容(但不一定等于)的现有文档时,才需要索引新文档。 我可以在多个字段上执行匹配查询并获得查询的全局分数,但是由于该分数不是可用最大分数的百分比,因此我不确定如何设置阈值来确定是否可以插入文档。

  • 问题内容: 我用Java实现了Levenshtein算法,现在可以通过算法进行更正,也就是成本。这确实有一点帮助,但并没有太大帮助,因为我希望将结果表示为百分比。 所以我想知道如何计算那些相似点。 我也想知道你们的人民是如何做的以及为什么。 问题答案: 两个字符串之间的Levenshtein距离定义为将一个字符串转换为另一个字符串所需的最小编辑次数,允许的编辑操作为单个字符的插入,删除或替换。(维

  • 我正在寻找创建一个数据库搜索(MySQL),使用PHP来查找电气部件的零件号,但希望搜索也能找到类似的字符 例如,搜索6SE7O90也应搜索6SE7090,搜索4I737A也应搜索4L737A,因为在某些零件标签上打印的0/O和I/L可能看起来相似。 在PHP/MySQL中实现这一点的最佳方法是什么?

  • 本文向大家介绍PHP实现搜索相似图片,包括了PHP实现搜索相似图片的使用技巧和注意事项,需要的朋友参考一下 感知哈希算法 count < =5 匹配最相似 count > 10 两张不同的图片 var_dump(ImageHash::run(‘./1.png', ‘./psb.jpg')); 方法二: 调用方式如下: 如果$result值为true, 则表明2个图片相似,否则不相似。