ElasticSearch: [multi_match] 查询不支持 [search_analyzer]

ElasticSearch: [multi_match] query does not support [search_analyzer]

在 ElasticSearch 7.x 中,我使用具有 synonym filter 的分析器为数据字段编制了索引。 但是,为了支持 "exactly" 匹配数据字段中的查询词而不是与数据中的同义词匹配的查询,我将使用 search_analyzer.

为此,对于我想要精确匹配的查询,我想提供一个没有同义词过滤器的分析器。这可以通过 search_analyzer 来完成。但是,我的主要查询是一个 multi_match 查询,用于在所有需要的字段上搜索这些术语(并且具有不同的重要性(提升))。

ElasticSearch 似乎不允许在 multi-match 查询中使用 search_analyzer。 有哪些选择?要么用于我的高级解决方案(在同义词上提升精确词),要么在我在具有不同提升(重要性权重)的不同字段中搜索时合并 search_analyzer

PS:我不想重新索引数据字段,一个有同义词分析器,另一个没有。

Search_analyzer索引时间param,所以如果要为同义词的字段设置它:

{
    "settings": {
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "synonym" : {
                        "tokenizer" : "whitespace",
                        "filter" : ["synonym"]
                    }
                },
                "filter" : {
                    "synonym" : {
                        "type" : "synonym",
                        "synonyms_path" : "analysis/synonym.txt"
                    }
                }
            }
        }
    }, "mappings" : {
      "properties" : {
        "description" : {
          "type" : "text",
          "analyzer": "synonym",
          "search_analyzer": "standard"
        },
        "content" : {
          "type" : "text",
          "analyzer": "synonym",
          "search_analyzer": "standard",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
}

通过这种方式,您已经为查询时间设置了默认分析器。所以您现在可以通过这种方式执行 multimatch 查询:

{
  "query": {
    "multi_match" : {
      "query":      "bread cereal",
      "type":       "cross_fields",
      "fields": [
        "description",
        "content"
      ],
      "operator":   "and" 
    }
  }
}

如果您没有在索引时为这些字段设置特定的 search_analyzer,则在查询时使用用于指示的同一分析器。如果您没有在索引时间设置 search_analyzer,您可以 force to use a specific analyzer at query timeanalyzer 参数放入查询中:

{
  "query": {
    "multi_match" : {
      "query":      "bread cereal",
      "analyzer" : "standard",
      "type":       "cross_fields",
      "fields": [
        "description",
        "content"
      ],
      "operator":   "and" 
    }
  }
}