Странные результаты эластичного поиска при использовании анализатора синонимов

#elasticsearch

#elasticsearch

Вопрос:

Когда я запускаю этот запрос

 "multi_match": {
    "query": "paper copier ", 
    "fields": [ "allStringFields" ],
    "type": "cross_fields",
    "operator": "and",
    "analyzer": "synonym"   
}
  

я получаю 1342 результата

Но когда я запускаю этот запрос (обратите внимание на порядок слов)

  "multi_match": {
    "query": " copier paper ", 
    "fields": [ "allStringFields" ],
    "type": "cross_fields",
    "operator": "and",
    "analyzer": "synonym"   
 }
  

Я получаю нулевые результаты

Я использую анализатор синонимов, и это является причиной такого поведения

Есть ли решение для этого?

Комментарии:

1. Мое определение индекса похоже на то, что вы написали здесь, но все равно не работает .

Ответ №1:

Добавление рабочего примера с индексными данными, сопоставлением, поисковым запросом и результатом поиска. В приведенном ниже примере я взял два синонима table и tables

 I get zero results
  

Пожалуйста, просмотрите сопоставление индексов еще раз. Согласно приведенному ниже примеру, ключевое слово для поиска — это table chair , это нужно искать в обоих полях title и content . Приведенный ниже запрос вернет документы, содержащие оба table AND chair . Чтобы получить подробное объяснение, обратитесь к документации ES по запросу с несколькими совпадениями и фильтру маркеров синонимов.

Сопоставление индексов:

 {
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "synonym_filter": {
            "type": "synonym",
            "synonyms": [
              "table, tables"
            ]
          }
        },
        "analyzer": {
          "synonym_analyzer": {
            "filter": [
              "lowercase",
              "synonym_filter"
            ],
            "tokenizer": "standard"
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      }
    }
  }
}
  

Индексировать данные:

 { "title": "table chair" }
{ "title": "tables chair" }
{ "title": "table fan" }
{ "title": "light fan", "content": "chair" }
  

Поисковый запрос:

 {
    "query": {
        "multi_match": {
            "query": "table chair",
            "operator": "and",
            "type":"cross_fields",
            "fields": [
                "title","content"
            ],
            "analyzer": "synonym_analyzer"
        }
    }
}
  

Результат поиска:

 "hits": [
      {
        "_index": "synonym",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.7227666,
        "_source": {
          "title": "table chair"
        }
      },
      {
        "_index": "synonym",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.3862942,
        "_source": {
          "title": "tables chair"
        }
      }
    ]
  

Поиск table chair или chair table , дает тот же результат поиска, что и показано выше.