Как получить точное соответствие более одной фразы - PullRequest
6 голосов
/ 13 июля 2020

Ниже приведен запрос для получения точного соответствия

GET courses/_search
{
  "query": {
    "term" : {
         "name.keyword": "Anthropology 230"
      }
  }
}

Мне нужно найти Anthropology 230 и Anthropology 250 also

Как получить точное совпадение

Ответы [ 3 ]

5 голосов
/ 16 июля 2020

Ошибка, которую вы делаете, заключается в том, что вы используете запрос термина в поле ключевого слова, и они оба не анализируются, что означает, что они пытаются найти точно такую ​​же строку поиска в инвертированном индексе.

Что вам следует сделать следующее: определить поле text, которое у вас все равно будет, если вы не определили свое отображение. Я также предполагаю то же самое, что и в вашем запросе, который вы упомянули .keyword, который создается автоматически, если вы не определяете сопоставление.

Теперь вы можете просто использовать ниже запрос соответствия , который анализируется и использует стандартный анализатор , который разбивает токен на пробелы, поэтому Anthropology 250 и 230 будут сгенерированы для ваших двух образцов документов.

Простой и эффективный запрос который приносит оба документа

{
    "query": {
        "match" : {
            "name" : "Anthropology 230"
        }
    }
}

И результат поиска

 "hits": [
      {
        "_index": "matchterm",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.8754687,
        "_source": {
          "name": "Anthropology 230"
        }
      },
      {
        "_index": "matchterm",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.18232156,
        "_source": {
          "name": "Anthropology 250"
        }
      }
    ]

Причина, по которой указанный выше запрос соответствует обоим документам, заключается в том, что он создал два токена anthropology и 230 и соответствует anthropology в обоих документах.

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

Анализировать вывод API для вашего текста

POST http: // {{hostname}}: {{port}} / { {index-name}} / _ анализировать

{
  "analyzer": "standard",
  "text": "Anthropology 250"
}


{
    "tokens": [
        {
            "token": "anthropology",
            "start_offset": 0,
            "end_offset": 12,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "250",
            "start_offset": 13,
            "end_offset": 16,
            "type": "<NUM>",
            "position": 1
        }
    ]
}
3 голосов
/ 16 июля 2020

Вы можете проверить и попробовать, match , match_phrase или match_phrase_prefix

Использование match ,

GET courses/_search
{
    "query": {
        "match" : {
            "name" : "Anthropology 230"
        }
    },
    "_source": "name"
}

Использование match_phrase ,

GET courses/_search
{
    "query": {
        "match_phrase" : {
            "name" : "Anthropology"
        }
    },
    "_source": "name"
}

OR с использованием regexp ,

GET courses/_search
{
    "query": {
        "regexp" : {
            "name" : "Anthropology [0-9]{3}"
        }
    },
    "_source": "name"
}
2 голосов
/ 16 июля 2020

Если у вас может быть больше предметов «Anthropology nnn», это должно сделать то, что вам нужно:

"query":{
    "bool":{
        "must":[
            {"term": {"name.keyword":"Anthropology 230"}},
            {"term": {"name.keyword":"Anthropology 250"}},
        ]  
    }
}
...