Выделение части слова в elasticsearch
Я сделал авто-суггестор в эластичном поиске, используя N-граммовый токенизатор. Теперь я хочу выделить введенную пользователем последовательность символов в списке автоматического предложения. Для этой цели я использовал маркер, доступный в elastic search мой код, как показано ниже, но в выводе полный термин выделяется, где я иду неправильно.
{
"query": {
"query_string": {
"query": "soft",
"default_field": "competency_display_name"
}
},
"highlight": {
"pre_tags": ["<b>"],
"post_tags": ["</b>"],
"fields": {
"competency_display_name": {}
}
}
}
И в результате получается
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "competency_auto_suggest",
"_type": "competency",
"_id": "4",
"_score": 1,
"_source": {
"review": null,
"competency_title": "Software Development",
"id": 4,
"competency_display_name": "Software Development"
},
"highlight": {
"competency_display_name": [
"<b>Software Development</b>"
]
}
}
]
}
}
Отображение
"competency":{
"properties": {
"competency_display_name":{
"type":"string",
"index_analyzer": "index_ngram_analyzer",
"search_analyzer": "search_term_analyzer"
}
}
}
Настройки
"analysis": {
"filter": {
"ngram_tokenizer": {
"type": "nGram",
"min_gram": "1",
"max_gram": "15",
"token_chars": [ "letter", "digit" ]
}
},
"analyzer": {
"index_ngram_analyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": [ "ngram_tokenizer", "lowercase" ]
},
"search_term_analyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": "lowercase"
}
}
}
Как выделить софт вместо программного обеспечения Развитие.
1 ответ:
Вы должны использовать N-грамм токенизатор вместо фильтра N-грамм, чтобы выделить в данном случае.
with_positions_offsetsнеобходимо, чтобы помочь выделить больше быстрее.Вот работоспособные настройки и отображение:
"analysis": { "tokenizer": { "ngram_tokenizer": { "type": "nGram", "min_gram": "1", "max_gram": "15", "token_chars": [ "letter", "digit" ] } }, "analyzer": { "index_ngram_analyzer": { "type": "custom", "tokenizer": "ngram_tokenizer", "filter": [ "lowercase" ] }, "search_term_analyzer": { "type": "custom", "tokenizer": "keyword", "filter": "lowercase" } } }Отображение
"competency":{ "properties": { "competency_display_name":{ "type":"string", "index_analyzer": "index_ngram_analyzer", "search_analyzer": "search_term_analyzer", "term_vector":"with_positions_offsets" } } }
Comments