ElasticSearch: [multi_match] запрос не поддерживает [search_analyzer] - PullRequest
0 голосов
/ 18 апреля 2020

В ElasticSearch 7.x я проиндексировал поля данных с помощью анализатора, который имеет фильтр синонимов . Однако для поддержки повышения запросов, которые «точно» соответствуют терминам запросов в полях данных по сравнению с их синонимами в данных, я собираюсь использовать search_analyzer.

С этой целью для запроса, которому я хочу точно соответствовать, я хочу предоставить анализатор, в котором нет фильтра синонимов. Это может быть сделано с помощью search_analyzer. Тем не менее, мой основной запрос - это запрос multi_match для поиска этих терминов по всем требуемым полям (и с разной важностью (повышение)).

Похоже, что ElasticSearch не позволяет search_analyzer в запросе multi-match. Какие есть альтернативы? либо для моего высокоуровневого решения (для повышения точных слов по их синонимам), либо для включения search_analyzer, когда я ищу в разных полях с различным усилением (весом важности).

PS: я не хочу переиндексировать поля данных, одно с помощью анализатора синонимов, а другое без.

1 Ответ

1 голос
/ 18 апреля 2020

Search_analyzer - это параметр для индекса времени , поэтому, если вы хотите установить его для поля с синонимом:

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

Если вы не задали указатель c search_analyzer во время индексации для этих полей, которые тот же анализатор использовал для индикации используется во время запроса. Если вы не установили search_analyzer для времени индекса, вы могли бы принудительно использовать указанный c анализатор во время запроса , вставив analyzer параметр в запрос:

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