Как искать по тексту с помощью стандартного анализатора в Elasti c Search - PullRequest
0 голосов
/ 08 мая 2020

У меня есть пара значений ключа, индексированная как текст в ES Mapping.

{key:myKey, value:MY_VALUE}

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

Итак: MY_VALUE преобразуется в члены [my, value]

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Если вы используете запрос соответствия без каких-либо изменений, тогда он использует тот же анализатор, который использовался для индексации поля, ie генерирует те же типы токенов для вашего поискового запроса и должен выдать вам результат поиска.

Согласно запросу Elasticsearch Match Do c:

Предоставленный текст анализируется перед сопоставлением.

Запрос на сопоставление является стандартным запросом для выполнения полного -текстовый поиск

Поскольку вы не предоставили никакого образца, позвольте мне показать его, используя мои данные образца:

Index def

{
  "mappings" :{
    "properties" :{
        "title" :{
            "type" : "text" --> default standard analyzer would be used.
        }
    }
  }
}

Примеры документов индекса

{
    "title": "foo bar"
}

{
    "title": "hello world"
}

поиск foo

{
    "query" :{
        "match" :{
            "title" :"foo"
        }
    }
}

Результат

 "hits": [
            {
                "_index": "standard",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.4700036,
                "_source": {
                    "title": "foo bar"
                }
            }
        ]

Искать foo bar

{
    "query" :{
        "match" :{
            "title" :"foo bar"
        }
    }
}

Результат

"hits": [
            {
                "_index": "standard",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.9400072,
                "_source": {
                    "title": "foo bar"
                }
            }
        ]

Примечание. Поиск foo и foo bar оба совпадения в качестве стандартного токена разделяют токены на пробелы, и вы можете использовать анализ API , чтобы проверить это, как показано ниже:

{
  "text" : "foo bar",
  "analyzer" : "standard"
}

{
    "tokens": [
        {
            "token": "foo",
            "start_offset": 0,
            "end_offset": 3,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "bar",
            "start_offset": 4,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

Изменить: на основе комментария из OP (@ AKA SH GUPTA)

Теперь Elasti c предоставляет поле ключевого слова по умолчанию для текстового поля, но это только для сопоставления Dynami c, а не для сопоставления stati c и это тоже в последних версиях. Пожалуйста, обратитесь к к этой записи в блоге, и если вы используете сопоставление stati c, вы можете определить собственное соответствующее поле keyword.

0 голосов
/ 18 мая 2020

Перемещение комментария к ответу: «Кажется, Elasti c Поиск по умолчанию предоставляет ключевое слово для текстовых полей. В этом случае его можно использовать как« title.keyword ».

Обратитесь: https://www.elastic.co/blog/strings-are-dead-long-live-strings (Раздел: Новые значения по умолчанию.)

Если у вас есть проблемы с «проанализированным» текстом и вы хотите, чтобы строка не анализировалась, вы можете добавить «.keyword» к вашему ключу. Перед этим сделайте проверьте, присутствует ли сопоставление, подобное:

"yourKey": {
     "type": "text",
     "fields": {
           "keyword": {
                "type": "keyword",
                "ignore_above": 256
           }
      }
}

Если его нет, обновите сопоставление, как указано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...