ElasticSearch-关键字填充和评分

zhte4eai  于 2023-01-12  发布在  ElasticSearch
关注(0)|答案(1)|浏览(136)

需要关键字填充帮助。
场景:我有2个演示,标题如下:
示例1:演示1:"烤蛋糕烤蛋糕蛋糕蛋糕烤"演示#2:"Bake Cake"现在,当我使用文本"Bake Cake"搜索时,结果必须返回最合适的匹配项,即演示文稿#2应该列在顶部/第一个。
示例2:演示1:"烤蛋糕烤蛋糕蛋糕蛋糕烤"演示#2:"烤蛋糕"演示#3:"bake A cake"现在,当我使用文本"Bake cake"进行搜索时,返回的结果必须是最合适的匹配项,即演示文稿#2应该列在顶部/第一个,然后是演示文稿#3,最后应该是演示文稿#1。
区分大小写无关紧要。

tpgth1q7

tpgth1q71#

首先,我将解释“Elasticsearch如何计算分数”,然后我将分享您的具体情况下的解决方案。

ElasticSearch如何计算分数

Elasticsearch使用一种名为TF-IDF(词频-逆文档频率)的评分算法来计算与查询匹配的文档的相关性得分。
TF(术语频率)是衡量一个术语在文档中出现的频率。一个术语在文档中出现的频率越高,该术语在文档中的TF得分就越高。
IDF(反向文档频率)是衡量某个术语在集合中的所有文档中的罕见程度。术语越罕见,其IDF分数就越高。
当Elasticsearch计算文档与查询的相关性分数时,它会同时考虑文档中查询词的TF分数以及所有文档中查询词的IDF分数。最终分数是TF和IDF分数的组合,通常表示为TF-IDF。
此外,Elasticsearch有一些功能,如字段长度规范,这可以提高较短字段的得分和一些其他功能,如查询规范,这规范化的基础上查询的数量得分.
还可以通过为查询提供自定义脚本来自定义评分算法,这在尝试匹配您的用例时允许更大的灵活性。
适用于您的案例的解决方案:案例1:按asc顺序排序可以解决问题。案例2:使用stop token filter删除停止词。以下是停止词

a, an, and, are, as, at, be, but, by, for, if, in, into, is, it, no, not, of, on, or, such, that, the, their, then, there, these, they, this, to, was, will, with

下面是一个例子:

#索引前创建分析器

PUT test_bake_cake
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "analyzer": "custom_analyzer"
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_analyzer": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "stop"
          ]
        }
      }
    }
  }
}

#为数据建立索引

POST _bulk
{ "index" : { "_index" : "test_bake_cake", "_id" : "1" } }
{ "text" : "Bake Cake Bake bake cake cake cake bake" }
{ "index" : { "_index" : "test_bake_cake", "_id" : "2" } }
{ "text" : "Bake Cake" }
{ "index" : { "_index" : "test_bake_cake", "_id" : "3" } }
{ "text" : "bake A cake" }

#搜索数据

GET test_bake_cake/_search
{
  "query": {
    "match": {
      "text": "bake cake"
    }
  },
  "sort": [
    {
      "_score": {
        "order": "asc"
      }
    }
  ]
}

输出将如你所愿。演示#2,#3和#1,如屏幕截图。x1c 0d1x

相关问题