Elasticsearch: точное совпадение фраз в одном поле - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу, чтобы следующий запрос возвращал результаты, где точные фразы, разделенные ИЛИ, совпадают в определенном поле.

{
  "query": {
    "nested": {
      "path": "positions",
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "default_field": "positions.companyname",
                "query": "microsoft OR gartner OR IBM"
              }
            },
            {
              "query_string": {
                "default_field": "positions.title",
                "query": "(Chief Information Security Officer) OR (Chief Digital Officer)"
              }
            }
          ]
        }
      },
      "inner_hits": {
        "highlight": {
          "fields": {
            "positions.title": {}
          }
        }
      }
    }
  }
}

Результаты должны содержать точное Главный сотрудник по информационной безопасности ИЛИ Главный сотрудник по цифровым данным ,

но не Шеф Цифровой Маркетинг Сотрудник ИЛИ Шеф Информация Офицер , поскольку он в настоящее время возвращается.

Кроме того, поле может не обязательно содержать точную фразу для поиска. Например:

«Директор по информационным технологиям» -> FALSE

"Начальник отдела цифровых технологий - главный специалист по цифровым технологиям" -> ИСТИНА

«Бывший главный специалист по информационной безопасности» -> ИСТИНА

"Главный информационный директор" -> Неверно

Полагаю, я пытаюсь подчеркнуть, что эти фразы всегда должны быть рядом (близость).

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Для вашего случая использования я бы предложил вам использовать запрос match_phrase внутри запроса bool should.

Примерно так должно работать:

GET stackoverflow/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "text": "Chief Information Security Officer"
          }
        },
        {
          "match_phrase": {
            "text": "Chief Digital Officer"
          }
        }
      ]
    }
  }
}
0 голосов
/ 11 апреля 2019

Этот запрос сделает это.

{
  "query": {
    "nested": {
      "path": "positions",
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "default_field": "positions.companyname",
                "query": "microsoft OR gartner OR IBM"
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "match_phrase": {
                      "positions.title": "chief information security officer"
                    }
                  },
                  {
                    "match_phrase": {
                      "positions.title": "chief digital officer"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

match_phrase гарантирует, что точная фраза ищется. Чтобы сопоставить несколько фраз в одном поле, используйте оператор bool с условием should .

...