Как сделать так, чтобы несколько токенов были фразами в эластичном поисковом запросе

Я хочу, чтобы часть запроса считалась фразой. Например, Я хочу выполнить поиск «Можете ли вы показать мне документы для индустрии гостеприимства и авиаперевозок?» Здесь я хочу, чтобы отрасль авиаперевозок рассматривалась как фраза. Я не нахожу таких настроек в multi_match. Даже когда мы пытаемся использовать запрос multi_match, используя "Можете ли вы показать мне документы для индустрии гостеприимства и \" авиапромышленности \ "". Анализатор по умолчанию разбивает его на отдельные токены. Я не хочу изменять настройки моего анализатора. Также я обнаружил, что мы можно сделать это в simple_query_string, но это приводит к тому, что мы не можем применить параметр фильтра, как в логическом запросе multi_match, потому что я хочу применить фильтр и к определенным элементам.

search_text = «Можете ли вы показать мне документы для индустрии гостеприимства и авиаперевозок?» Теперь я хочу передать «Отрасль авиаперевозок» в качестве фразы для поиска в моем проиндексированном документе по 2 полям. хорошо, скажем, у меня есть такой код.

If filter:
qry={
    “query":{
        “bool”:{
            “must”:{
                "multi_match":{
                "query":search_text,
                "type":"best_fields",
                "fields":["TITLE1","TEXT"],
                "tie_breaker":0.3,
                }
            },
            “filter”:{“terms”:{“GRP_CD”:[“1234”,”5678”]     }
    }
    }

else:
qry={

    "query":{
        "multi_match":{
        "query":search_text',
        "type":"best_fields",
        "fields":["TITLE1",TEXT"],
        "tie_breaker":0.3
        }
    }
}

'Но потом я понял, что этот код не обрабатывает отрасль авиаперевозок как фразу, хотя я передаю строку для поиска, подобную этой: «Можете ли вы показать мне документы для индустрии гостеприимства и \" отрасли авиаперевозок »»

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

qry={"query":{
"simple_query_string":{
"query":"Can you show me documents for Hospitality and \"Airline Industry\"",
"fields":["TITLE1","TEXT"] }
} }

Но теперь моя проблема в том, что, если пользователь хочет применить фильтр ... с запросом фильтра, как указано выше, я не могу передать фразу, а логический запрос невозможен с помощью simple_query_string '


person aradhana chaturvedi    schedule 05.06.2020    source источник
comment
simple_query_string - один из правильных вариантов, но какие фильтры вы не сможете применить при использовании simple_query_string. Можете ли вы объяснить, например,   -  person Nishant    schedule 06.06.2020
comment
@OpsterESNinjaNishant обновлен кодом   -  person aradhana chaturvedi    schedule 06.06.2020


Ответы (1)


Вы всегда можете комбинировать запросы, используя логический запрос.. Давайте разберемся с этим в каждом конкретном случае. Прежде чем перейти к кейсам, я хотел бы уточнить одну вещь, касающуюся фильтра. Предложение фильтра логического запроса ведет себя так же, как предложение must, но разница в том, что любой запрос (даже другой логический запрос с предложением must / should) внутри предложения фильтра имеет контекст фильтра. Контекст фильтра означает, что эта часть запроса не будет учитываться при подсчете баллов.

Теперь перейдем к кейсам:

Случай 1. Только запрос, без фильтров.

{
  "query": {
    "bool": {
      "must": [
        {
          "simple_query_string": {
            "query": "Can you show me documents for Hospitality and \"Airline Industry\"",
            "fields": [
              "TITLE1",
              "TEXT"
            ]
          }
        }
      ]
    }
  }
}

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

Случай 2: Фразовый запрос с фильтром.

{
  "query": {
    "bool": {
      "must": [
        {
          "simple_query_string": {
            "query": "Can you show me documents for Hospitality and \"Airline Industry\"",
            "fields": [
              "TITLE1",
              "TEXT"
            ]
          }
        }
      ],
      "filter": [
        {
          "terms": {
            "GRP_CD": [
              "1234",
              "5678"
            ]
          }
        }
      ]
    }
  }
}

Таким образом вы можете комбинировать запрос (контекст запроса) с фильтрами.

person Nishant    schedule 07.06.2020
comment
Большое спасибо за ваш ответ. Я попробую эти запросы, заданные вами. TWW согласны ли вы, что multi_match не обрабатывает частичную фразу правильно и simple_query_string - единственный вариант? Извините, но я новичок в эластичном поиске. - person aradhana chaturvedi; 07.06.2020
comment
Вы можете выполнить полный поиск по фразе, но не частичный. Например, при поиске строки quick brown fox вы можете искать всю эту строку как фразу, но если вы хотите только brown fox для полной строки как фразы, а остальное как обычный запрос строка, то это невозможно сделать с помощью одного запроса multi_match. - person Nishant; 08.06.2020