{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edgeNGram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"test": {
"properties": {
"suggest": {
"type": "completion",
"analyzer": "autocomplete"
},
"hostname": {
"type": "text"
}
}
}
}
} `
Вышеупомянутое сопоставление сохраняется в эластичном поиске.
POST index/test
{
"hostname": "testing-01",
"suggest": [{"input": "testing-01"}]
}
POST index/test
{
"hostname": "testing-02",
"suggest": [{"input":"testing-02"}]
}
POST index/test
{
"hostname": "w1-testing-01",
"suggest": [{"input": "w1-testing-01"}]
}
Индекс POST / тест
{
"hostname": "w3-testing-01",
"предложение": [{"ввод": "w3-testing-01"}]
}
`
Когда есть 30 документов с именем хоста, начинающимся с w1, и именами хоста w3, при поиске термина «w3» я получаю сначала предложения всех w1, а затем w3.
Предложение Запрос
{
"query": {
"_source": {
"include": [
"text"
]
},
"suggest": {
"server-suggest": {
"text": "w1",
"completion": {
"field": "suggest",
"size": 10
}
}
}
}
}
Пробовал разные анализаторы, та же проблема. может какое-нибудь тело руководство?
Это обычная ловушка. Это потому, что min_ngram
равен 1, и, следовательно, и w1-testing-01
, и w3-testing-01
будут производить токен w
. Поскольку вы указали только analyzer
, анализатор autocomplete
также включится во время поиска, и, следовательно, предложения поиска для w3
также будут выдавать токен w
, поэтому оба w1-testing-01
и w3-testing-01
совпадают.
Решение состоит в том, чтобы добавить search_analyzer
в ваше поле suggest
, чтобы анализатор autocomplete
не использовался во время поиска (вы можете использовать standard
, keyword
или любой другой анализатор, подходящий для вашего варианта использования), но только во время индексации.
"mappings": {
"test": {
"properties": {
"suggest": {
"type": "completion",
"analyzer": "autocomplete",
"search_analyzer": "standard" <-- add this
},
"hostname": {
"type": "text"
}
}
}
}
Честно говоря, анализатор standard
отбрасывает дефисы, тогда используйте анализатор keyword
.
Спасибо, Вэл. Я обновлю отображение и повторно проиндексирую данные.
Теперь он работает так, как ожидалось. Токенизатор для анализатора автозаполнения заменен на пробел. Спасибо, yoou Val!
Отлично, рад, что помог!
Если имеется 30 документов, начинающихся как с w1, так и с w3, результаты все равно начинаются с w1. Нам нужны предложения, в том числе хифенс. Стандартный анализатор не включает бедра. Что ты предлагаешь ?