Как я могу достичь этого типа запросов в ElasticSearch? - PullRequest
0 голосов
/ 24 декабря 2018

Я добавил такой документ в свой индекс

POST /analyzer3/books
{
  "title": "The other day I went with my mom to the pool and had a lot of fun"
}

И затем я выполняю такие запросы

GET /analyzer3/_analyze
{
  "analyzer": "english",
  "text": "\"The * day I went with my * to the\""
}

И он успешно возвращает ранее добавленный документ.

Моя идея состоит в том, чтобы иметь кавычки, чтобы запрос становился точным, а также подстановочные знаки, которые могут заменить любое слово.Google обладает именно этой функциональностью, где вы можете выполнять поиск по таким запросам, например, "I'm * the university", и он будет возвращать результаты страницы, содержащие такие тексты, как I'm studying in the university right now и т. Д.

Однако я хочу знать, есть ли другой способчтобы сделать это.

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

Любой ответ приветствуется.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Elasticsearch не имеет Google как поиск из коробки, но вы можете создать что-то похожее.

Давайте предположим, что когда кто-то цитирует поисковый текст, он хочет, чтобы это было запрос фразы поиска .В основном удалите \" и найдите оставшуюся строку как фразу.

PUT test/_doc/1
{
  "title": "The other day I went with my mom to the pool and had a lot of fun"
}

GET test/_search
{
  "query": {
    "match_phrase": {
      "title": "The other day I went with my mom to the pool and had a lot of fun"
    }
  }
}

Для * становится немного интереснее.Вы можете просто сделать несколько фраз поиска и объединить их.Пример:

GET test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {
            "title": "The"
          }
        },
        {
          "match_phrase": {
            "title": "day I went with my"
          }
        },
        {
          "match_phrase": {
            "title": "to the"
          }
        }
      ]
    }
  }
}

Или вы можете использовать slop в поиске фразы.Все термины в вашем поисковом запросе должны быть там (если они не удаляются токенизатором или не являются стоп-словами), но в совпавшей фразе могут быть дополнительные слова в фразе.Здесь мы можем заменить каждое * на 1 другим словом, так что всего 2.Если вы хотите, чтобы вместо каждого * было более 1 слова, вам нужно выбрать более высокий помет:

GET test/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "The * day I went with my * to the",
        "slop": 2
      }
    }
  }
}

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

0 голосов
/ 24 декабря 2018

Точные совпадения на токенизированных полях не так просты.Лучше сохраните свое поле как keyword, если у вас есть такие требования.

Кроме того, keyword тип данных поддерживает запрос по шаблону, который может помочь вам в поиске по шаблону.

Так что просто создайте keyword тип подполя.Затем используйте для этого шаблонный запрос.

Ваш поисковый запрос будет выглядеть примерно так:

GET /_search
{
    "query": {
        "wildcard" : { 
            "title.keyword" :  "The * day I went with my * to the" 
         }
    }
}

В приведенном выше запросе предполагается, что поле title имеет подполес именем keyword типа данных keyword.

Подробнее о подстановочном запросе можно найти здесь .

Если вы все еще хотите выполнить точный поиск по textтип данных, затем прочитайте это

...