Как сопоставить все слова из документа в поисковом запросе? - PullRequest
1 голос
/ 04 мая 2020

Предположим, есть 3 документа:

{
  "id": 1
  "recipe": "egg apple peach"
}
{
  "id": 2
  "recipe": "egg apple"
}
{
  "id": 3
  "recipe": "egg apple potato"
}

Я хочу выполнить поиск так, чтобы в моем поисковом запросе присутствовали все слова поля recipe документа.

Таким образом, query : "egg apple peach" должен возвращать документы 1 и 2.

query : "egg apple" должен возвращать документы 2.

Как я могу предоставить этот тип запроса с Elasticsearch?

1 Ответ

0 голосов
/ 04 мая 2020

term_set

Возвращает документы, содержащие минимальное количество точных терминов в предоставленном поле

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

Поле типа token_count действительно является целочисленным полем, которое принимает строковые значения, анализирует их, а затем индексирует количество токенов в строке.

В индексе мы будем сохранить номер токена для рецепта.

Пример: Для «рецепт»: «Яблочно-яблочный картофель» recipe.length = 3 Для "recipe": "egg apple" recipe.length = 2

Отображение:

PUT index12
{
  "mappings": {
    "properties": {
      "id":{
        "type": "integer"
      },
      "recipe":{
        "type": "text",
        "fields": {
          "length":{
            "type":"token_count",
            "analyzer":"standard"
          }
        }
      }
    }
  }
}

Запрос:

{
  "query": {
    "terms_set": {
      "recipe": {
        "terms": [
          "egg",
          "apple",
          "peach"
        ],
        "minimum_should_match_script": {
          "source": """ if(doc['recipe.length'].size()==0) return 0; else return doc['recipe.length'].value"""
        }
      }
    }
  }
}

Результат:

"hits" : [
      {
        "_index" : "index12",
        "_type" : "_doc",
        "_id" : "Wj563XEBly0sCU1FGf2v",
        "_score" : 1.1871837,
        "_source" : {
          "id" : 1,
          "recipe" : "egg apple peach"
        }
      },
      {
        "_index" : "index12",
        "_type" : "_doc",
        "_id" : "Wz563XEBly0sCU1FIf06",
        "_score" : 0.29748765,
        "_source" : {
          "id" : 2,
          "recipe" : "egg apple"
        }
      }
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...