【问题标题】:Elasticsearch match queryElasticsearch 匹配查询
【发布时间】:2021-09-13 07:39:26
【问题描述】:

我正在某个字段中搜索一些文本。
但问题是每当两个文档包含所有搜索标记时,具有更多搜索标记的文档会获得更多点,而不是长度较短的文档。

我的 ElasticSearch 索引包含一些食物名称。我想在里面找点吃的。

文档结构是这样的
{"text": "NAME OF FOOD"}

现在我有两个类似的文件

1: {"text": "Apple Syrup Apple Apple Syrup Apple Smoczyk's"}
2: {"text": "Apple Apple"}

如果我使用此查询进行搜索

{
    "query": {
        
                "match": {
                    "text": {
                        "query": "Apple"
                    }
                }
    }
}

第一个文档首先出现,因为其中包含更多 Apple

这不是我的预期结果。我会很好,第二个文档得到更多点,因为其中有 Apple 并且它的长度比第一个短。

【问题讨论】:

    标签: database elasticsearch full-text-search


    【解决方案1】:

    弹性搜索评分赋予词频、字段长度权重。一般来说,较短的字段得分较高,但词频可以抵消它。

    您可以使用唯一过滤器为文本生成唯一标记。这样多次出现同一个token不会影响评分。

    映射

    {
      "mappings": {
        "properties": {
          "text": {
            "type": "text",
            "analyzer": "my_analyzer"
          }
        }
      },
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer": {
              "tokenizer": "standard",
              "filter": [
                "unique", "lowercase"
              ]
            }
          }
        }
      }
    }
    

    分析

    GET index29/_analyze
    {
       "text": "Apple Apple",
       "analyzer": "my_analyzer"
    }
    

    结果

    {
      "tokens" : [
        {
          "token" : "apple",
          "start_offset" : 0,
          "end_offset" : 5,
          "type" : "<ALPHANUM>",
          "position" : 0
        }
      ]
    }
    

    即使 apple 出现两次,也只会生成单个令牌。

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多