开发者社区 > 大数据与机器学习 > 检索分析服务 Elasticsearch版 > 正文

大家好,es搜索结果中完全匹配的结果评分反而在后面,这个问题该如何解决呐?

大家好,es搜索结果中完全匹配的结果评分反而在后面,这个问题该如何解决呐?

展开
收起
真的很搞笑 2023-03-18 19:12:28 1230 1
6 条回答
写回答
取消 提交回答
  • 随心分享,欢迎友善交流讨论:)

    这个问题可能是由于 Elasticsearch 的评分算法导致的。Elasticsearch评分算法是基于 TF-IDF(term frequency-inverse document frequency)的,它权衡了一个文档中某个词的出现次数以及该词在所有文档中的出现频率,如果某个词在当前文档中出现频繁,但在其他文档中也同样出现频繁,那么它的相关性就会被降低。

    所以,如果您希望在完全匹配的情况下,相关度更高的结果排在前面,可以考虑使用其他评分算法,例如 BM25(Okapi BM25),这种算法比 TF-IDF 更加适用于长文本搜索,并且在某些情况下会优于 TF-IDF。您可以在 Elasticsearch 中使用 BM25评分算法,具体可以参考 Elasticsearch 的官方文档。

    除了评分算法以外,您还可以尝试以下策略来提高完全匹配的结果评分:

    1、使用 Exact-Phrase 查询:如果您希望只获取完全匹配的结果,您可以使用 Exact-Phrase 查询,它会返回完全匹配的结果,但是它只适用于短语查询。

    2、使用 Boosting 查询:您可以在完全匹配的查询中使用 Boosting 查询,通过提高完全匹配的权重来增加相关性。

    3、使用 Script Scoring:在评分时,您可以使用一个自定义的脚本来计算每个文档的得分,这样可以根据您的需求对得分进行自定义的调整。

    希望以上信息能够帮助您解决问题。

    2023-03-28 15:43:30
    赞同 展开评论 打赏
  • 是不是用的ASC升序哟,此回答整理自钉群“Elasticsearch中文技术社区”

    2023-03-22 10:18:23
    赞同 展开评论 打赏
  • 月移花影,暗香浮动

    在 Elasticsearch 中,搜索结果的排序是基于文档评分(Document Score)进行的。文档评分是根据文档与查询的匹配程度计算得出的,其中包括了很多指标,比如倒排文档频率(Inverted Document Frequency)、词汇匹配度(Term Matching)、字段的权重 (Field Boosting)等等。因此在某些情况下,完全匹配的结果评分反而在后面,这可能是由于完全匹配的结果与查询的词语频率或其在字段中出现的位置等相关因素有关。

    从解决这个问题的角度看,一种可能的办法是通过改变查询条件或文档的评分来解决。具体来说,可以考虑以下几种方式:

    1.使用 Function Score Query(函数评分查询)来改变文档评分,通过手动指定查询条件和权重,来使完全匹配的结果得到更高的评分。 2.使用 Term Query(词项查询)中的 Boosting Parameter(提升参数)来提高完全匹配的结果的评分。具体来说,可以在查询中将完全匹配的词项通过 Boosting Parameter 的方式提高其权重,从而让其在文档评分中占据更大的比重。 3.通过调整 Mapping(映射)中字段的 Boosting(权重)来改变文档的评分,从而让完全匹配的结果得到更高的评分。具体来说,可以在字段的 Mapping 中设置 boost 参数,来提高该字段在文档评分中的权重。

    总之,解决这个问题的方法取决于具体的场景和需求。需要根据实际情况对查询和文档评分进行调整,从而得到合适的结果。

    2023-03-20 11:10:04
    赞同 展开评论 打赏
  • 试试调整评分算法或者设置权重和排序规则。

    2023-03-19 10:03:38
    赞同 展开评论 打赏
  • 如果在 ES 搜索结果中完全匹配的结果评分反而在后面,可以考虑调整搜索算法的权重设置,使得完全匹配的结果评分更高。 同时,也可以考虑对搜索结果进行排序,将完全匹配的结果排在前面,以提高搜索结果的准确性和用户体验。 另外,也需要注意数据的质量和准确性,避免因为数据不准确而导致搜索结果不准确的情况发生。

    2023-03-19 08:35:16
    赞同 展开评论 打赏
  • 场景1:最佳字段查询

    搜索时,完全匹配的关键字排名更靠前,采用best_fields进行查询。

    String queryString = "ChadJ";
    MultiMatchQueryBuilder multiMatchQuery = QueryBuilders
                        .multiMatchQuery(queryString, "nickName", "realeName")
                        .type(MultiMatchQueryBuilder.Type.BEST_FIELDS)
                        .tieBreaker(0.1f); 
    boolQuery.must(multiMatchQuery);
    
    1. 设置type为best_fields
    2. 未完全匹配的文档分数乘以系数0.1
    3. 拉大完全匹配和未完全匹配的分数区间。

    场景2:最佳字段优化,相同值的权重

    当昵称nickName和realeName相同的时候,想让真实姓名的字段权重更高。

    String queryString = "ChadJ";
    // 最佳字段  + 降低除了realeName之外字段的权重系数
    MatchQueryBuilder nickNameQuery = QueryBuilders.matchQuery("realeName", queryString);
    MatchQueryBuilder realeNameQuery = QueryBuilders.matchQuery("nickName", queryString).boost(0.8f);
    DisMaxQueryBuilder disMaxQueryBuilder = QueryBuilders.disMaxQuery().add(nickNameQuery ).add(realeNameQuery );
    queryBuilder.withQuery(disMaxQueryBuilder);
    

    通过boost可以降低某些条件的权重系数

    2023-03-19 08:05:15
    赞同 1 展开评论 打赏
滑动查看更多

阿里云检索分析服务Elasticsearch版兼容开源ELK功能,免运维全托管,提升企业数据检索与运维分析能力。

热门讨论

热门文章

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载