ElasticSearch如何保证所有词都参与搜索

ElasticSearch how to ensure that all words are involved in search

假设我在 ElasticSearch 6 中有一个索引:

"mappings" : {
  "pet" : {
      "name" : {
         "type" : "text"
      },          
      "info" : {
         "type" : "text"
      },
      "description" : {
         "type" : "text"
      }
   }
}

我需要使用用户键入的相同输入字符串对所有字段执行全文搜索:'big grey dog' 或 'small cute cat'。我如何在相关性中搜索那些包含来自输​​入的更多单词的单元。无论在哪里 - 名称或描述。我想要那个单位:

{
    "name" : "big",
    "info" : "grey",
    "description" : "dog" 
}

得分高于单位:

{
    "name" : "grey dog",
    "info" : "dog dog grey dog",
    "description" : "grey dog grey dog grey dog" 
}

如果您正在使用 multiMatch 查询,您应该使用 cross_field 类型和 AND 运算符 (see here)。

但是因为它只会匹配包含所有术语的文档,所以你应该使用带有两个 should 子句的 bool query,一个带有默认类型(又名 best_fields )和默认类型的松散子句OR 运算符和类型为 cross_field 和运算符 AND 的严格运算符。

有了这个,它会提升匹配所有字段的文档,并继续显示只匹配某些术语的低分文档:

类似于:

"query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "<here your query>",
            "fields": ["name", "info", "description"],
            "type": "cross_fields",
            "operator": "AND"
          }
        },
        {
          "multi_match": {
            "query": "<here your query>",
            "fields": ["name", "info", "description"],
          }
        }
      ]
    }
  }