Elastic Search v6.3: запрос с фильтром никогда не возвращает совпадений - PullRequest
0 голосов
/ 08 мая 2019

Я столкнулся с некоторыми проблемами с Elastic Search.Я хочу сделать запрос по некоторому тексту, а затем фильтровать по категории.Я следовал за Elastic Search 6.3 Документация для запросов , но мой ответ для ES всегда пуст.Я точно знаю, что у меня есть хотя бы одна запись, которая должна соответствовать запросу.Ниже я разместил свой запрос в Elastic Search, и запись, которую я знаю, присутствует в моем индексе Elastic Search.Любая помощь очень ценится.

Запрос

{
    "from": 0,
    "size": 300,
    "query": {
      "bool": {
        "filter": {
          "term": {"category": "Soups"}
        },
        "should": [
          {"term": {"instructions": "Matt"}},
          {"term": {"introduction": "Matt"}},
          {"term": {"recipe_name": "Matt"}},
        ],
        "minimum_should_match": 1,
        "boost": 1.0
      }
    }
  }

Запись, присутствующая в упругом поиске

        {
            "_index": "recipes",
            "_type": "_doc",
            "_id": "QMCScWoBkkkjW61rD81v",
            "_score": 0.2876821,
            "_source": {
                "calories": 124,
                "category": "Soups",
                "cook_time": {
                    "hour": "2",
                    "min": "4"
                },
                "cooking_temp": "375",
                "cooking_temp_units": "°F",
                "creator_username": "virtualprodigy",
                "ingredients": [
                    {
                        "majorQuantity": "1 ",
                        "measuring_units": "teaspoon",
                        "minorQuantity": " ",
                        "name": "mett"
                    }
                ],
                "instructions": "instructions",
                "introduction": "intro",
                "prep_time": {
                    "hour": "1",
                    "min": "2"
                },
                "recipe_name": "Matt Test",
                "servings": 1
            }
        }

1 Ответ

2 голосов
/ 08 мая 2019

Ваши поля, вероятно, проиндексированы с помощью стандартного анализатора, что означает, что они разбиты на токены и в нижнем регистре. term query является точным соответствием и не выполняет этот анализ, поэтому вы ищете 'Matt', и он имеет только 'matt'.Вы ищете «Супы», и в нем есть только «супы».Самое простое решение - это изменить ваши термины запросов на совпадения запросов .например:

{
    "from": 0,
    "size": 300,
    "query": {
        "bool": {
            "filter": {
                "match": {
                    "category": "Soups"
                }
            },
            "should": [
                {"match": {"instructions": "Matt"}},
                {"match": {"introduction": "Matt"}},
                {"match": {"recipe_name": "Matt"}}
            ],
            "minimum_should_match": 1,
            "boost": 1.0
        }
    }
}
...