Агрегация по срокам, а не по всему полю - PullRequest
0 голосов
/ 27 июня 2018

У меня есть индекс с продуктами (ES 6.3), где некоторые названия продуктов выглядят так: Tomato, Tomatosoup, Tomatojuice и т. Д. Я пытаюсь достичь, когда я запрашиваю, например, к термину Toma, чтобы получить совокупность лучших совпадающих терминов вместо полных названий продуктов.

Для этого у меня есть следующее отображение:

{
  "name": {
    "type": "text",
    "analyzer": "custom-ngram" // Defined in the mapping
    "search-analyzer": "standard",
    "fields": {
      "suggestion": {
        "type": "text",
        "fielddata": true,
        "analyzer": "standard"
      }
    }
  }
}

и мой запрос выглядит так:

{
  "query": {
    "bool": {
      "must":{
        "multi_match": {
          "query": "tom",
          "fields": ["name^3", "description"]
        }
      }
    }
  },
  "aggs": {
    "suggestions": {
      "terms": {
        "field": "name.suggestion",
        "include": "tom.*", 
        "size": 10
      }
    }
  },
  "size": 0
}

Действительно, это работает и возвращает мне то, что мне нужно, но у меня есть две проблемы:

  1. Использование fielddata, которое не рекомендуется на основании документов ES
  2. Использование директивы includes для фактической фильтрации групп агрегации

Это правильный путь для решения этой проблемы или подход совершенно неверный? Есть ли лучший метод решения этой проблемы?

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