【问题标题】:Elastic Search match query returns incorrect results and scoreElastic Search 匹配查询返回不正确的结果和分数
【发布时间】:2017-03-01 14:08:32
【问题描述】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      搜索结果相关且得分与预期结果相符。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多