Проблема с эластичным поиском 2.0 / 2.1 с выделением и запросом Bool

У меня проблема с выделением в Elastic 2.0 и 2.1 - он возвращает больше информации, чем я думаю.

Я создаю запрос типа bool (ключевое слово запроса отфильтровано устарело в версии 2.0+, поэтому я пытаюсь обновить свой синтаксис). Я создаю в запросе раздел обязательно и раздел фильтр, за которым следует запрос на выделение информации.

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

Вот мой полностью сформированный запрос:

GET /sample04/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "query": { "query_string": { "query": "east west" } }
                }
            ],
            "filter": [
                {
                    "terms": {"OwnerId": ["1", "2","3"]}
                }
            ]
        }
    },
    "highlight": {
        "fields": {
            "*": { "require_field_match": "false" }
        }
    }
}

Итак, этот запрос работает так, как ожидалось - мы запрашиваем термины восток или запад, и мы фильтруем документы по полю Id, которое является частью наших требований безопасности, а затем я прошу выделить информацию.

Обратной стороной, однако, является то, что информация о выделении содержит попадание каждого экземпляра каждого значения, которое я отправил в свой фильтр (в данном случае 1, 2 или 3), которое соответствует любому значению в любом поле в любой части моего документа, например:

 "highlight": {
               "SomeTextField": [
                  "North <em>West</em>"
               ],
               "OwnerId": [
                  "<em>3</em>"
               ],
               "SerialNumber": [
                  "<em>3</em>-<em>3</em>"
               ],
               "AssociatedValue": [
                  "<em>3</em>",
                  "<em>2</em>"
               ],
               "RelatedValue": [
                  "<em>3</em>",
                  "<em>3</em>",
                  "<em>3</em>",
                  "<em>3</em>",
                  "<em>3</em>"
               ]
            }

Как заставить маркер соответствовать моему запросу в обязательном разделе, но игнорировать фильтр? Я считаю, что он должен игнорировать выделение совпадений, которые были частью фильтра, особенно когда он выделяет поля, содержащие значения, которые были запрошены для фильтрации КОНКРЕТНОГО ПОЛЯ, но оно использует значение где угодно в моем документе. Это почему-то кажется неправильным, но, возможно, это мое понимание.

К вашему сведению, если я установлю для require_field_match значение TRUE, то я получу ТОЛЬКО совпадения, соответствующие фильтру, и НЕТ, соответствующие запросу.

Я не могу указать поле, для которого будет генерироваться выделенная информация, в то время как мы используем Elastic как поисковую модель, которая может быть найдена в любом месте, поэтому я не знаю, из какого поля будет возвращен мой результат.

Вы видите, что я делаю не так? Было бы очень признательно понять это.


person Dexterama    schedule 30.11.2015    source источник


Ответы (1)


Вы можете использовать запрос выделения для этого. измените выделенную часть на

"highlight": {
    "fields": {
      "*": {
        "highlight_query": {
          "query_string": {
            "query": "east west"
          }
        }
      }
    }
  }
person ChintanShah25    schedule 30.11.2015