Mam trzy dokumenty z "username" polu:ElasticSearch edgeNGram dla autouzupełniania wpisywanie znaków z wyprzedzeniem, to mój search_analyzer ignorowane
- 'briandilley'
- 'briangumble'
- 'briangriffen'
Kiedy szukam "briana", wszystkie trzy odzyskują zgodnie z oczekiwaniami, ale kiedy szukam "briandilley", wciąż odzyskuję wszystkie trzy. Interfejs API analizy mówi mi, że używa filtru ngram w ciągu wyszukiwania, ale nie jestem pewien dlaczego. oto moja konfiguracja:
ustawienia Index:
{
"analysis": {
"analyzer": {
"username_index": {
"tokenizer": "keyword",
"filter": ["lowercase", "username_ngram"]
},
"username_search": {
"tokenizer": "keyword",
"filter": ["lowercase"]
}
},
"filter": {
"username_ngram": {
"type": "edgeNGram",
"side" : "front",
"min_gram": 1,
"max_gram": 15
}
}
}
}
mapowanie:
{
"user_follow": {
"properties": {
"targetId": { "type": "string", "store": true },
"followerId": { "type": "string", "store": true },
"dateUpdated": { "type": "date", "store": true },
"userName": {
"type": "multi_field",
"fields": {
"userName": {
"type": "string",
"index": "not_analyzed"
},
"autocomplete": {
"type": "string",
"index_analyzer": "username_index",
"search_analyzer": "username_search"
}
}
}
}
}
}
wyszukiwania:
{
"from" : 0,
"size" : 50,
"query" : {
"bool" : {
"must" : [ {
"field" : {
"targetId" : "51888c1b04a6a214e26a4009"
}
}, {
"match" : {
"userName.autocomplete" : {
"query" : "brian",
"type" : "boolean"
}
}
} ]
}
},
"fields" : "followerId"
}
I ve wypróbowane matchQuery, matchPhraseQuery, textQuery i termQuery (java DSL api) i uzyskuję zawsze te same wyniki.
Robię to w badanej jednostki Java - więc dlatego nie ma żadnych wypowiedzi CURL (za pomocą klienta w pamięci). –
Są szanse, że wtedy robisz coś złego. Odwzorowując to jako zwinięcie, możesz zobaczyć, czy możesz odtworzyć problem. Jeśli nie, problem występuje w kodzie Java. (Mam na myśli ręczne tworzenie instrukcji zwijania, co możesz zrobić) – DrTech
Miałeś rację - indeksowałem nazwę użytkownika celu zamiast jego nazwę użytkownika. Zasadniczo złe indeksowanie z mojej strony. Oceniłem twoją odpowiedź jako poprawną, ponieważ pomogłeś doprowadzić mnie do prawdziwego problemu. –