美文网首页
ES搜索结果优化

ES搜索结果优化

作者: ChadJ | 来源:发表于2019-11-26 09:15 被阅读0次

默认匹配查询

按照ES的默认分词计算匹配度的结果

MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("nickName", nickName);
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
boolBuilder.must(matchQueryBuilder);

权重查询

提升某些字段的权重,但是这样会导致完全匹配的被排在后面的问题。

boolQuery.should(QueryBuilders.matchQuery("nickName", queryString).boost(3.0f));
boolQuery.should(QueryBuilders.matchQuery("realName", queryString).boost(1.f));

即使真实姓名完全匹配,也会根据权重被排在后面。

Multi Match Query

The way the multi_match query is executed internally depends on the type parameter, which can be set to:
best_fields
(default) Finds documents which match any field, but uses the _score from the best field.
most_fields
Finds documents which match any field and combines the _score from each field.
cross_fields
Treats fields with the same analyzer as though they were one big field. Looks for each word in any field.
phrase
Runs a match_phrase query on each field and uses the _score from the best field.
phrase_prefix
Runs a match_phrase_prefix query on each field and uses the _score from the best field.
bool_prefix
Creates a match_bool_prefix query on each field and combines the _score from each field.

大致的意思就是

  • best_fields:(默认)查找匹配的文档,使用最佳字段的得分。
  • most_fields:查找匹配的文档,合并每个字段的得分。
  • cross_fields:用同一个分析器处理一个大字段,查找每个单词。
  • phrase:使用来自最佳字段的分数。
  • phrase_prefix:使用最佳字段的分数。
  • bool_prefix:合并每个字段的得分。

场景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可以降低某些条件的权重系数

相关文章

  • ES搜索结果优化

    默认匹配查询 按照ES的默认分词计算匹配度的结果 权重查询 提升某些字段的权重,但是这样会导致完全匹配的被排在后面...

  • 搜索结果页优化

    搜索就像是用户和系统之间的对话:用户键入他们的信息需求作为问询关键词,系统则展现出它的回答作为一组结果。搜索结果页...

  • 搜索结果页优化

    业务场景 优化方案 1. 首屏服务端渲染 方案一:node+ejs 方案二:node+vue+vuex 适用的场景...

  • 无标题文章

    SEO优化 一、了解网络优化 1.搜索引擎优化是指从自然搜索结果获得网站流量。 2.自然排名...

  • PPC和SEO的不同差异

    搜索引擎优化(SEO)就是优化网站和网页以在搜索引擎中进行搜索的做法,从而在搜索引擎搜索结果页上显示更多的可见位置...

  • 聚焦Python分布式爬虫必学框架 Scrapy 打造搜索引擎

    了解搜索网站大体功能 搜索网站首页 搜索网站搜素结果页 es完成搜索建议-搜索建议字段保存 事实上 elastic...

  • SEO 基本介绍和优化

    SEO(Search Engine Optimization)搜索引擎优化: 为了提升网页在搜索引擎自然搜索结果中...

  • 搜索结果排序结果优化(已完成)

    问题描述 1、简书的搜索结果可以根据一定的规则进行排序,默认是综合排序,可切换至其他排序,综合排序的结果还是比较友...

  • elasticsearch filter查询与bitset

    关于Filter 从solr到es,一路下来对搜索引擎的长期使用,工作内容也包含大量的搜索优化的问题,无论是搜索质...

  • es读优化

    es搜索数据 es搜索数据流程 es读写流程示意图 分布式搜索示意图image.png es的几种搜索类型 QUE...

网友评论

      本文标题:ES搜索结果优化

      本文链接:https://www.haomeiwen.com/subject/osajwctx.html