Я хочу создать поисковый запрос для приложения для социальных сетей таким образом, чтобы пользователи могли искать других пользователей по имени или имени, даже вводя часть имени или имени пользователя с помощью asticsearch .
Например:
input: okma
result: {"username": "alokmahor", "name": "Alok Singh Mahor"} // partial match in username
input: m90
result: {"username": "ram9012", "name": "Ram Singh"} // partial match in username
input: shn
result: {"username": "r2020", "name": "Krishna Kumar"} // partial match with name
После прочтения и воспроизведения этих ссылок я придумаю свое частичное решение, которое я не уверен, правильно ли это.
Я следовал
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html
Как искать часть слова с ElasticSearch
Мое решение
DELETE my_index
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 3,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"properties": {
"username": { "type": "text", "analyzer": "my_analyzer" },
"name": { "type": "text", "analyzer": "my_analyzer" }
}
}
}
PUT /my_index/_doc/1
{
"username": "alokmahor",
"name": "Alok Singh Mahor"
}
PUT /my_index/_doc/2
{
"username": "ram9012",
"name": "Ram Singh"
}
PUT /my_index/_doc/3
{
"username": "r2020",
"name": "Krishna Kumar"
}
GET my_index/_search
{
"query": {
"multi_match": {
"query": "shn",
"analyzer": "my_analyzer",
"fields": ["username", "name"]
}
}
}
каким-то образом это решение частично работает, и я не уверен, что это действительно правильный путь, как я понял после того, как начал играть в функции aorundasticsearch и копировать пример кода вставки. Поэтому, пожалуйста, предложите правильный путь или улучшение этого.
Вещи, которые не работают
// "sin" is not matching with "Singh" but "Sin" is matching and working.
GET my_index/_search
{
"query": {
"multi_match": {
"query": "sin",
"analyzer": "my_analyzer",
"fields": ["username", "name"]
}
}
}