ES 自定义评分实现结果集排序问题

这篇具有很好参考价值的文章主要介绍了ES 自定义评分实现结果集排序问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求

需求是根据短句查询后,不分词全包含(类似mysql的like)的语句要在最上边,其次是分词后的数据全包含的排在后边,然后是包含部分分词的数据,最后这三类数据要根据时间倒叙,自带的评分机制无法满足需求,所以使用function_score 自定义结果的评分:

创建索引

用到了ik分词器

PUT /robot1018
{
  "settings" : {
      
     "index": {
      "routing": {
        "allocation": {
          "include": {
            "_tier_preference": "data_content"
          }
        }
      },
      "number_of_shards": "3",    
      "max_result_window": "10000000",
      "analysis": {
        "filter": {
          "my_synonyms": {
            "type": "synonym",
            "synonyms_path": "synonyms/my_synonyms1.txt",
            "updateable": "true"
          },
          "my_stopwords": {
            "type": "stop",
            "updateable": "true",
            "stopwords_path": "stops/my_stopwords1.txt"
          },
          "my_pinyin": {
            "ignore_pinyin_offset": "true",
            "keep_joined_full_pinyin": "true",
            "lowercase": "true",
            "keep_original": "false",
            "keep_first_letter": "false",
            "keep_separate_first_letter": "false",
            "type": "pinyin",
            "keep_none_chinese": "false",
            "limit_first_letter_length": "50",
            "keep_full_pinyin": "true"
          }
        },
        "analyzer": {
          "pinyin_ik_max_word_analyzer": {
            "filter": [
              "my_pinyin"
            ],
            "type": "custom",
            "tokenizer": "ik_max_word"
          },
          "pinyin_ik_smart_analyzer": {
            "filter": [
              "my_pinyin"
            ],
            "type": "custom",
            "tokenizer": "ik_smart"
          },
          "synonym_stop_ik_smart_analyzer": {
            "filter": [
              "my_stopwords",
              "my_synonyms"
            ],
            "tokenizer": "ik_smart"
          }
        }
      },
      "number_of_replicas": "3" 
    }
   },
    
    "mappings": {
    
      "properties": {
        "create_time": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "guid": {
          "type": "keyword"
        },
        "id": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "question": {
         "type": "text",
          "fields": {
            "pinyin": {
              "type": "text",
              "analyzer": "pinyin_ik_max_word_analyzer",
              "search_analyzer": "pinyin_ik_smart_analyzer"
            },
             "question_text": {
              "type": "keyword"            
            }
          },

          "analyzer": "ik_smart",
          "search_analyzer": "synonym_stop_ik_smart_analyzer"
        }
        }
      }    
  }
}

由于match_phrasa 查询会自动过滤标点符号,所以在question下加了个question_text字段 类型为keyword 不分词,用于通过 wildcard 过滤第一层的全匹配条件
例如:

  "match_phrase": {
              "question": {
                 "query": "供暖申请",
                 "slop": 0
              }
            }

查询的结果集中 会出现 “个人能否申请市政供暖?申请市政供暖条件及流程?“的结果,客户觉得这种不是全匹配的,所以我用wildcard 过滤全匹配的,也有说修改ik源码的,可自行尝试那种方法。

查询语句

GET robot1020/_search
{
  "from": 0,
  "size": 30,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "adjust_pure_negative": true,
          "must": [
            {
              "match": {
                "question": {
                  "query": "老小区后期申请市政供暖交换站选址安装有无相关要求?",
                  "minimum_should_match": "1",
                  "max_expansions": 50
                }
              }
            }
          ]

        }
      },
      "functions": [
        {
          "filter": {
            "wildcard": {
              "question.question_text": "*老小区后期申请市政供暖交换站选址安装有无相关要求?*"
            }
          },
          "weight": 2
        },
        {
          "filter": {
            "match_phrase": {
              "question": {
                "query": "老小区后期申请市政供暖交换站选址安装有无相关要求?",
                "slop": 0
              }
            }
          },
          "weight": 2
        },
        {
          "filter": {
            "match_phrase": {
              "question": {
                "query": "老小区后期申请市政供暖交换站选址安装有无相关要求?",
                "slop": 4
              }
            }
          },
          "weight": 2
        },
        {
          "filter": {
            "match_phrase": {
              "question": {
                "query": "老小区后期申请市政供暖交换站选址安装有无相关要求?",
                "slop": 10
              }
            }
          },
          "weight": 2
        },
        {
          "filter": {
            "match": {
              "question": {
                "query": "老小区后期申请市政供暖交换站选址安装有无相关要求?",
                "minimum_should_match": "2"
              }
            }
          },
          "weight": 2
        },
        {
          "filter": {
            "match": {
              "question": {
                "query": "老小区后期申请市政供暖交换站选址安装有无相关要求?"
              }
            }
          },
          "weight": 2
        }
      ],
      "boost_mode": "replace"
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    },
    {
      "create_time": {
        "order": "desc"
      }
    }
  ],
  "track_total_hits": 2147483647,
  "_source": [
    "question",
    "create_time"
  ]
}

每满足一个条件评分都会乘以2,所以全部满足filter条件的话评分是所有过滤方法里的weight 乘积,这样就实现了需求,也可以多些几个filter过滤,把结果集分的更细一些
es自定义排序,ES,elasticsearch,搜索引擎
结果满足预期,问题解决

另外 boost_mode : replace 指的是 用自己的函数的得分替换掉原先的评分,默认是 multiply (与原评分相乘)

其他相关的参数含义 都很容易搜到文章来源地址https://www.toymoban.com/news/detail-536997.html

到了这里,关于ES 自定义评分实现结果集排序问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于Elasticsearch(es)中使用sql返回结果只有1000条

    es中返回的结果只有1000条,这是默认的,想要返回更多的结果,需要做两步: 1、设置max_result_window的大小 PUT indexName/_settings { “max_result_window”:20000 } max_result_window表示结果的最大数量 但是你这样设置完了之后,查询依旧还是1000条 2、查询的时候加上fetch_size 这表示页面上显

    2024年02月14日
    浏览(41)
  • Elasticsearch es查询结果只返回指定筛选字段_source

    参考:https://www.exception.site/elasticsearch/elasticsearch-query-custom-columns *** 只返回title、channel结果;下列两种语法方式都可以

    2024年02月11日
    浏览(50)
  • ElasticSearch系列 - SpringBoot整合ES:指定搜索结果返回的字段_source

    Elasticsearch的搜索结果可以通过以下参数进行控制: from:指定搜索结果的起始位置,默认为0。 size:指定返回的文档数量,默认为10。 sort:指定搜索结果的排序方式,可以按照字段升序或降序排列。 query:指定搜索的查询条件,可以使用各种查询语句进行搜索。 filter:指定

    2024年02月04日
    浏览(51)
  • 【Elasticsearch】ES精确查询和范围查询,ES时间字段排序实例,ES倒排索引介绍

    termQuery matchQuery 模糊查询 multiMatchQuery 多个字段模糊查询 如果时间字段写入时用的类型是Text,可以用“时间字段.keyword”来处理 #查询前传入分页参数 #分页后拿到总记录数 把文档D对应到的映射转换为到文档ID的映射,每个都对应着一系列的文档,这些文

    2024年02月15日
    浏览(117)
  • ES框架--ES评分规则详解

    一、需求 因为需要对搜索结果进行一个统一化的评分,因此需要仔细研究ES本身的评分规则从而想办法把评分统一。 省流:无法确切统一化 二、ES查询评分规则 之前有说过ES的查询评分原理,那么仔细思考之后就会发现,长文本搜索对应的score会比短文本搜索的score高很多:

    2024年02月16日
    浏览(35)
  • ElasticSearch如何使用以及java代码如何查询并排序ES中的数据(距离排序)

    import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.unit.

    2024年04月12日
    浏览(50)
  • ES检索结果高亮显示JAVA以及Kibana实现

    对比做了高亮前后的结果返回: 高亮前: 高亮后: 可以看到加入高亮的代码之后返回的json串命中的被套了一层em style=‘color: red’xxx/em标签,也就是我们前置设置的preTags与postTags; 当然hightlight本身支持多个字段高亮,java代码实现只要设置多个     后续查询出结果之

    2024年02月11日
    浏览(41)
  • ES(6)查询评分机制

    基于词频和逆文档词频公式简称 TF-IDF公式 得分 = boost(权重) * idf * tf 分数越高查询到的位置越靠前 Term Frequency: 搜索文本中的各个词条(term) 在查询文本中出现了多少次,次数越多评分越高 Inverse Document Frequency: 搜索文本中的各个词条在整个索引的所有文档中出现了多少次,出

    2024年02月15日
    浏览(42)
  • Elasticsearch:创建自定义 ES Rally tracks 的分步指南

    作者:Alejandro Sánchez 按照这个综合教程学习如何制作个性化的 Rally tracks ES Rally 是一个用于在 Elasticsearch® 上测试性能的工具,允许你运行和记录比较测试。 做出决策可能很困难,尤其是当你没有所需的信息并且只能根据过去积极或消极的变化进行猜测或经验时。 如果我们补

    2024年02月21日
    浏览(99)
  • Elasticsearch (ES) 搜索引擎: 搜索功能:搜索分页、搜索匹配、全文搜索、搜索建议、字段排序

    原文链接:https://xiets.blog.csdn.net/article/details/132348920 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) ES 搜索 API 官网文档:Search APIs 先创建一个索引,并写入一些文档用于搜索示例: 写入一些文档示例: 官网API:The _source option 搜索结果中的文档数据封装

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包