ElasticSearch подсказка завершения Стандартный анализатор не работает
Мы используем подсказку завершения ElasticSearch со стандартным анализатором, но кажется, что текст не разбит на токены.
например
Тексты: "Первый пример", "Второй пример"
Поиск: "Fi" возвращает "Первый пример"
В то время как
Поиск: "Ex" не возвращает никакого результата, возвращает "Первый пример"
3 ответа
Как документ Elastic о подсказчике завершения:
Подсказка завершения - это так называемая подсказка префикса.
Поэтому, когда вы отправляете ключевое слово, оно будет искать префикс ваших текстов.
Например:
Поиск: "Fi" => "Первый пример"
Поиск: "Sec" => "Второй пример"
но если вы дадите Elastic "Ex", он ничего не возвращает, потому что не может найти текст, который начинается с "Ex".
Вы можете попробовать другие предложения, такие как: термин предложение
Отличная работа заключается в том, чтобы токенизировать строку самостоятельно и поместить ее в отдельное поле токенов. Затем вы можете использовать 2 предложения в вашем предложении для поиска в обоих полях.
Пример:
PUT /example
{
"mappings": {
"doc": {
"properties": {
"full": {
"type": "completion"
},
"tokens": {
"type": "completion"
}
}
}
}
}
POST /example/doc/_bulk
{ "index":{} }
{"full": {"input": "First Example"}, "tokens": {"input": ["First", "Example"]}}
{ "index":{} }
{"full": {"input": "Second Example"}, "tokens": {"input": ["Second", "Example"]}}
POST /example/_search
{
"suggest": {
"full-suggestion": {
"prefix" : "Ex",
"completion" : {
"field" : "full",
"fuzzy": true
}
},
"token-suggestion": {
"prefix": "Ex",
"completion" : {
"field" : "tokens",
"fuzzy": true
}
}
}
}
Результат поиска:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": 0,
"hits": []
},
"suggest": {
"full-suggestion": [
{
"text": "Ex",
"offset": 0,
"length": 2,
"options": []
}
],
"token-suggestion": [
{
"text": "Ex",
"offset": 0,
"length": 2,
"options": [
{
"text": "Example",
"_index": "example",
"_type": "doc",
"_id": "Ikvk62ABd4o_n4U8G5yF",
"_score": 2,
"_source": {
"full": {
"input": "First Example"
},
"tokens": {
"input": [
"First",
"Example"
]
}
}
},
{
"text": "Example",
"_index": "example",
"_type": "doc",
"_id": "I0vk62ABd4o_n4U8G5yF",
"_score": 2,
"_source": {
"full": {
"input": "Second Example"
},
"tokens": {
"input": [
"Second",
"Example"
]
}
}
}
]
}
]
}
}
Один из подходов к взлому предложений из каждой позиции строки может состоять в том, чтобы связать строку, взять только черепицу с позицией 0, из каждой черепицы взять последний токен.
PUT example
{
"settings": {
"index.max_shingle_diff": 10,
"analysis": {
"filter": {
"after_last_space": {
"type": "pattern_replace",
"pattern": "(.* )",
"replacement": ""
},
"preserve_only_first": {
"type": "predicate_token_filter",
"script": {
"source": "token.position == 0"
}
},
"big_shingling": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 10,
"output_unigrams": true
}
},
"analyzer": {
"dark_magic": {
"tokenizer": "standard",
"filter": [
"lowercase",
"big_shingling",
"preserve_only_first",
"after_last_space"
]
}
}
}
},
"mappings": {
"properties": {
"suggest": {
"type": "completion",
"analyzer": "dark_magic",
"search_analyzer": "standard"
}
}
}
}
Этот хак работает для коротких строк (в примере до 10 токенов).