ElasticSearch - 以任何顺序匹配一个或任何字段中的所有搜索令牌

ElasticSearch - Match all search tokens in one or any fields in any order

我正在尝试编写一个 elasticsearch (v7.17) 查询,该查询 returns 我的搜索词中的所有标记在一个或任意数量的字段中以任何顺序匹配的所有文档。

我可以针对每个字段执行此操作,使用带有运算符 andmulti_match 查询,但我想对任意数量的字段执行此操作,例如,如果有 3 个字段:text1text2number1 并且它们被填充为两个文档:

文本 1: 'Car', 文本 2:'Audi', 数字 1:'A6'

文本 1: 'Car Audi', 文本 2:'' 数字 1:'Q7'、

我想在搜索“Car Audi”时找到所有两个,但在搜索“Car Audi A6”时只找到第一个,none在搜索“Car Audi A8”时只找到第一个。

如果不将它们全部写入同一个字段(我不想也不能这样做,因为它们在映射中部分具有不同的分析器),我如何才能做到这一点?

重要的是要注意映射有点复杂,并且字段具有不同的分析器,因此字段 text 中的搜索标记“Audi”也将匹配“Audi-123”,例如在字段 number1 不是这种情况。

在此先感谢您的帮助。

您可以仅使用 multi_match 查询获得相同的结果。在这里,您需要将 operator 值设置为 and,将 type 值设置为 cross_fields。请参阅 this 文档。

查询:

POST test/_search
{
  "query": {
    "multi_match": {
      "query": "Car Audi A6",
      "fields": [
        "text1",
        "text2",
        "number1"
      ],
      "type": "cross_fields", 
      "operator": "and"
    }
  }
}