Elasticsearch对数组中每个成员的minimumShouldMatch

ckx4rj1h  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(229)

考虑一个ElasticSearch实体:

{
   "id": 123456,
   "keywords": ["apples", "bananas"]
}

现在,假设我想通过搜索apple来找到这个实体。

{
  "match" : {
    "keywords" : {
      "query" : "apple",
      "operator" : "AND",
      "minimum_should_match" : "75%"
    }
  }
}

问题是数组中的两个字符串都需要最小匹配值75%,所以什么都找不到。有没有办法说类似minimumSouldMatch: "75% of any array fields"的东西?
请注意,我需要使用AND,因为keywords的每个项目可能由较长的文本组成。
编辑:
我尝试了提出的解决方案,但没有一个给出预期的结果。我猜问题是文本可能相当长,例如:
["national gallery in prague", "narodni galerie v praze"]
我猜模糊扩展只是不能扩展这么长的字符串,如果你只是开始搜索“国家g”。
通过嵌套对象,这是否可能实现?

{ keywords: [{keyword: "apples"}, {keyword: "babanas"}}

然后在关键字上加上minimumShouldMatch=1然后在每个keyword上加上75%

b5buobof

b5buobof1#

根据文件
匹配查询的类型为布尔值。这意味着分析提供的文本,分析进程将根据提供的文本构造布尔查询。可以将运算符参数设置为或或和来控制布尔子句(默认为或)。可以使用minimum_should_match参数设置要匹配的可选should子句的最小数目。
如果您要搜寻多个词语基元,例如“apples mangoes”,并将最小值设定为100%,则表示两个词语基元都应该出现在文件中。如果您将其设定为50%,则表示至少应该出现其中一个词语基元。
如果要部分匹配令牌
可以使用模糊参数
使用模糊性可以设置匹配所允许的最大编辑距离

{
  "query": {
    "match": {
      "keywords": {
        "query": "apple",
        "fuzziness": "auto"
      }
    }
  }
}

如果您尝试将单词与其根形式进行匹配,则可以使用“stemming”标记过滤器

PUT index-name
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "filter": [ "stemmer" ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "keywords":{
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

生成的令牌

GET index-name/_analyze
{ 
   "text":  ["apples", "bananas"],
   "analyzer": "my_analyzer"
}

"tokens" : [
    {
      "token" : "appl",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "banana",
      "start_offset" : 7,
      "end_offset" : 14,
      "type" : "<ALPHANUM>",
      "position" : 101
    }
  ]

词干分解将单词分解为它们的根形式。
您还可以探索n-gram、边缘gram以进行部分匹配

相关问题