【问题标题】:ElasticSearch: [multi_match] query does not support [search_analyzer]ElasticSearch:[multi_match] 查询不支持 [search_analyzer]
【发布时间】:2020-07-31 13:50:09
【问题描述】:

在 ElasticSearch 7.x 中,我使用具有 synonym filter 的分析器为数据字段编制索引。 但是,为了支持将与数据字段中的查询词“完全”匹配的查询提升为与数据中与其同义词匹配的查询,我将使用search_analyzer

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

似乎 ElasticSearch 不允许在 multi-match 查询中使用 search_analyzer。 有哪些替代方案?要么是为了我的高级解决方案(在同义词上提升精确词),要么在我在不同领域搜索时合并search_analyzer 以不同的提升(重要性权重)。

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

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl elasticsearch-query


    【解决方案1】:

    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" 
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多