Эластичный поиск, как сделать соответствие строки запроса Точной фразе - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно, чтобы строка запроса соответствовала только в том случае, если она точно такая же.

Согласно эластичной документации в запросе строки запроса:

Пробелы не учитываютсяоператоры, это означает, что город Нью-Йорк будет передан «как есть» на анализатор, настроенный для поля.Если поле является полем ключевых слов, анализатор создаст один термин Нью-Йорк, и построитель запросов будет использовать этот термин в запросе.Если вы хотите запрашивать каждый термин отдельно, вам нужно добавить явные операторы вокруг этих терминов (например, new AND york AND city).

Я создал индекс testingindex и добавил случайные данные:

  • banna af
  • тестирование CD af
  • тестирование CD
  • af телевидение
  • тестирование ab

Сообщение:

POST testingindex/_doc/5
{
  "name":"banna af" 
}

Поиск:

GET testingindex/_search?explain
{
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "fuzziness": 0, 
            "phrase_slop": 0, 
            "default_operator": "OR", 
            "minimum_should_match": "99%", 
            "fields": [
              "name"
            ],
            "query":"(testing af) OR (banna af)"
          }
        }
      ]
    }
  }
}

Результаты:

"hits" : [
      {
        "_index" : "testingindex",
        "_type" : "_doc",
        "_id" : "6",
        "_score" : 2.0794415,
        "_source" : {
          "name" : "banna af"
        }
      },
      {
        "_index" : "testingindex",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.8630463,
        "_source" : {
          "name" : "cd testing af"
        }
      },
      {
        "_index" : "testingindex",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.6931472,
        "_source" : {
          "name" : "testing cd"
        }
      },
      {
        "_index" : "testingindex",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 0.5753642,
        "_source" : {
          "name" : "af television"
        }
      },
      {
        "_index" : "testingindex",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "testing ab"
        }
      }
    ]

Если я поменяю оператора на:

"default_operator": "AND",

Я получаю правильные результаты.

Но если я изменю запрос на:

    "query":"(testing af) OR (banna af) OR (badfadfaf)"

Я не получаю результатов, мне все еще нужны результаты, чтобы вернуться, которые соответствуют.

Как мне получить тестирование компакт-дисков af и banna af , которые будут единственными возвращенными результатами?

1 Ответ

0 голосов
/ 12 апреля 2019

Просто оберните сами термины в двойные кавычки (которые вы должны избегать) для точного соответствия и удалите свойство minimum_should_match - упрощенный запрос будет выглядеть так:

GET testingindex/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "fields": [
              "name"
            ],
            "query":"(\"testing af\") OR (\"banna af\") OR (\"badfadfaf\")"
          }
        }
      ]
    }
  }
}

Уступая:

"hits" : {
    "total" : 2,
    "max_score" : 1.3862944,
    "hits" : [
      {
        "_index" : "testingindex",
        "_type" : "_doc",
        "_id" : "qmD-EWoBqkB-aMRpwfuE",
        "_score" : 1.3862944,
        "_source" : {
          "name" : "banna af"
        }
      },
      {
        "_index" : "testingindex",
        "_type" : "_doc",
        "_id" : "q2D_EWoBqkB-aMRpFPtX",
        "_score" : 0.5753642,
        "_source" : {
          "name" : "cd testing af"
        }
      }
    ]
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...