Elastic Search 匹配查询 returns 不正确的结果和分数

Elastic Search match query returns incorrect results and score

在我的弹性搜索数据库中插入 6 条记录后,我正在尝试弹性搜索示例。

插入的记录很简单json,有两个属性Id和text

"OCC-001","Car Damaged During Loading"
"OCC-002","Car jango  jango  jango  Damaged Loading"
"OCC-003","hjjkhjkasd hjkhjklhas d Cars asdasd jango asdsas  jango  jango  Damaged asdsad asdasdasd Loading"
"OCC-004","This should not come at all "
"OCC-005","This may come Car"
"OCC-006","Will this come Cars"

我正在进行如下搜索

SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(
                matchQuery("title","Car Damaged"))
                .build();

        FacetedPage<Occurrence> occurrences = myElasticSearchRepository.search(searchQuery); 
        return occurrences; 

我得到的结果不正确且顺序错误

"OCC-005","This may come Car"
"OCC-001","Car Damaged During Loading"
"OCC-002","Car jango  jango  jango  Damaged Loading"

当我使用以下查询进行相同的搜索时,我得到了正确的结果,但是 顺序不同

http://localhost:9200/myIndex/cars/_search?q=Car%20Damaged

"OCC-001","Car Damaged During Loading"
"OCC-002","Car jango  jango  jango  Damaged Loading"
"OCC-005","This may come Car"
"OCC-003","hjjkhjkasd hjkhjklhas d Cars asdasd jango asdsas  jango  jango  Damaged asdsad asdasdasd Loading"

看来我在做一些根本不正确的事情。

请指教。

如果您是 Elasticsearch 的新手,我建议您尝试使用 Request Body Search 而不是 URI 搜索。你可以找到它 here。如果需要查询工具,可以试试Sense

为了 Java 客户端库与 Elasticsearch 交互 here 因为我在 1 年前遇到过一个问题,因为 Spring 数据 elasticsearch 在与 Elasticsearch 匹配的更新版本中非常慢版本。

我在这个例子中使用了嵌入式弹性搜索。 调试了一段时间后,我尝试删除并重新创建索引。

您可以使用 http://localhost:9200/_cat/indices?v 监控指数。 弹性搜索的所有主要功能都有一个作弊 sheet - 清除缓存、刷新索引等

可能我的索引已损坏。我删除了旧索引并以不同的名称重新创建了索引,它按预期工作。

搜索结果相关,得分符合预期结果。

如果您有多个分片和少量数据,那么在使用默认搜索类型 query_then_fetch 时可能会得到错误的分数,因为当少量数据分散在多个分片中时,IDF 算法开始给出不好的结果。 在这种情况下,您很可能正在寻找另一种搜索类型,即 dfs_query_then_fetch。 应该是这样的

SearchQuery searchQuery = new NativeSearchQueryBuilder()
                                   .withQuery(matchQuery("title","Car Damaged"))                                    
                                   .withSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                                   .build();

有关搜索类型及其重要性的其他信息可在此处找到https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-type.html#search-request-search-type