弹性搜索匹配查询返回不正确的结果并得分

时间:2017-03-01 14:08:33

标签: elasticsearch spring-data-elasticsearch

我在弹性搜索数据库中插入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"

看起来我有些根本不正确。

请告知。

3 个答案:

答案 0 :(得分:1)

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

让Java客户端库与Elasticsearch here进行交互,因为我在1年前遇到了一个问题,因为Spring数据弹性搜索在更新版本中速度很慢,与Elasticsearch版本相匹配。

答案 1 :(得分:0)

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

您可以使用http://localhost:9200/_cat/indices?v监控索引。 有一个用于弹性搜索所有主要功能的备忘单 - 清除缓存,刷新索引等。

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

搜索结果是相关的,分数与预期结果相符。

答案 2 :(得分:0)

如果您有多个分片和少量数据,那么在使用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