Elasticsearch: simple_query_string и синонимы из нескольких слов - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть поле со следующим search_analyzer:

"name_search_en" : {
   "filter" : [
     "english_possessive_stemmer",
     "lowercase",
     "name_synonyms_en",
     "english_stop",
     "english_stemmer",
     "asciifolding"
   ],
   "tokenizer" : "standard"
}

name_synonyms_en - это синоним_графа, который выглядит следующим образом

"name_synonyms_en" : {
  "type" : "synonym_graph",
   "synonyms" : [
      "beach bag => straw bag,beach bag",
      "bicycle,bike"
    ]
 }

При выполнении следующего запроса multi_match синоним правильно применяется

{
  "query": {
    "multi_match": {
      "query": "beach bag",
      "auto_generate_synonyms_phrase_query": false,
      "type": "cross_fields",
      "fields": [
        "brand.en-US^1.0",
        "name.en-US^1.0"
      ]
    }
  }
}

Вот вывод объяснения _validate. Как и ожидалось, в необработанном запросе присутствуют и пляжная сумка, и соломенная сумка:

"explanations" : [
{
  "index" : "d7598351-311f-4844-bb91-4f26c9f538f3",
  "valid" : true,
  "explanation" : "+((((+name.en-US:straw +name.en-US:bag) (+name.en-US:beach +name.en-US:bag))) | (brand.en-US:beach brand.en-US:bag)) #DocValuesFieldExistsQuery [field=_primary_term]"
}
]

Я ожидал бы того же в следующем simple_query_string

{
  "query": {
    "simple_query_string": {
      "query": "beach bag",
      "auto_generate_synonyms_phrase_query": false,
      "fields": [
        "brand.en-US^1.0",
        "name.en-US^1.0"
      ]
    }
  }
}

но синоним соломенной сумки в необработанном запросе отсутствует

"explanations" : [
{
  "index" : "d7598351-311f-4844-bb91-4f26c9f538f3",
  "valid" : true,
  "explanation" : "+((name.en-US:beach | brand.en-US:beach)~1.0 (name.en-US:bag | brand.en-US:bag)~1.0) #DocValuesFieldExistsQuery [field=_primary_term]"
}
]

Проблема, по-видимому, связана только с синонимами из нескольких терминов. Если я ищу велосипед, синоним велосипеда правильно присутствует в запросе

"explanations" : [
{
  "index" : "d7598351-311f-4844-bb91-4f26c9f538f3",
  "valid" : true,
  "explanation" : "+(Synonym(name.en-US:bicycl name.en-US:bike) | brand.en-US:bike)~1.0 #DocValuesFieldExistsQuery [field=_primary_term]"
}
]

Является ли это ожидаемым поведением (то есть синонимы с несколькими терминами не поддерживаются для этого запроса)?

1 Ответ

0 голосов
/ 05 апреля 2019

По умолчанию simple_query_string имеет включенный флаг WHITESPACE. Входной текст маркируется. По этой причине фильтр синонимов неправильно обрабатывает несколько слов. Этот запрос отключает все флаги, заставляя синонимы из нескольких слов работать как положено

{
  "query": {
    "simple_query_string": {
      "query": "beach bag",
      "auto_generate_synonyms_phrase_query": false,
      "flags": "NONE", 
      "fields": [
        "brand.en-US^1.0",
        "name.en-US^1.0"
      ]
    }
  }
}

К сожалению, это не очень хорошо с параметром minimum_should_match. Полное обсуждение и более подробную информацию об этом можно найти здесь https://discuss.elastic.co/t/simple-query-string-and-multi-terms-synonyms/174780

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...