ElasticSearch и анализаторы (index_analyzer, search_analyzer)

337 views
Skip to first unread message

Oleg Meleshko

unread,
Dec 23, 2014, 4:34:35 AM12/23/14
to elastics...@googlegroups.com
После просмотра данного видео https://www.youtube.com/watch?v=7FLXjgB0PQI возник вопрос про search_analyzer и index_analyzer.
Я сразу же прочитал оф. доки, но так и не понял почему ES отрабатывает именно таким образом.

Например у меня есть такая конфигурация:

      "settings" : {
       
"analysis" : {      
         
"filter" : {
           
"autocomplete" : {
             
"type" : "edge_ngram",
             
"min_gram" : 1,
             
"max_gram" : 20
           
}
         
},
         
"analyzer" : {
           
"autocomplete" : {
             
"type" : "custom",
             
"tokenizer" : "standard",
             
"filter" : ["lowercase", "autocomplete"]
           
}
         
}
       
}
     
},
     
"mappings" : {
       
"user" : {
         
"properties" : {
           
"name" : {
             
"type" : "multi_field",
             
"fields" : {
               
"name" : {
                 
"type" : "string",
                 
"analyzer" : "standard"
               
},
               
"autocomplete" : {
                 
"type" : "string",
                 
"index_analyzer" : "autocomplete",
                 
"search_analyzer" : "standard"
               
}
             
}
           
}
         
}
       
}
     
}

В индекс положим всего 2 имени: John Smith и Johnathan Smith.

После этого я делаю такие поисковые запросы:

{
   
"match" : {
     
"name.autocomplete" : "john smi"
   
}
}


и

{
   
"match" : {
     
"name" : "john smi"
   
}
}

Если я понимаю правильно, то я должен был увидеть один и тот же результат, т.к. в обоих случаях ES должен был использовать standard analyzer, но я получил разные результаты. 
Вопрос: почему?


Oleg Meleshko

unread,
Dec 23, 2014, 6:14:09 AM12/23/14
to elastics...@googlegroups.com
Написал запросы здесь: http://sense.qbox.io/gist/9359c8c89f0ae2548af37f77a7668f316d6024bd чтобы было видно что я имею в виду.

вторник, 23 декабря 2014 г., 11:34:35 UTC+2 пользователь Oleg Meleshko написал:

Igor Motov

unread,
Dec 26, 2014, 10:47:50 PM12/26/14
to elastics...@googlegroups.com
index_analyzer используется при индексировании, то есть первая запись индексируется как два токена в поле "name"

curl -s "localhost:9200/test_index/_analyze?analyzer=standard&pretty" -d "Johnathan Smith" | grep \"token\"
    "token" : "johnathan",
    "token" : "smith",

и как 14 токенов в поле name.autocomplete

curl -s "localhost:9200/test_index/_analyze?analyzer=autocomplete&pretty" -d "Johnathan Smith" | grep \"token\"
    "token" : "j",
    "token" : "jo",
    "token" : "joh",
    "token" : "john",
    "token" : "johna",
    "token" : "johnat",
    "token" : "johnath",
    "token" : "johnatha",
    "token" : "johnathan",
    "token" : "s",
    "token" : "sm",
    "token" : "smi",
    "token" : "smit",
    "token" : "smith",

во время поиска для обоих полей используется стандартный анализатор:

curl -s "localhost:9200/test_index/_analyze?analyzer=standard&pretty" -d "john smi" | grep \"token\"
    "token" : "john",
    "token" : "smi",

в поле "name" токенов  "john" или "smi" нет, поэтому первая запись при поиске по "name" не возвращается. А в поле name.autocomplete такие токены есть вот вы ее и получаете 
Reply all
Reply to author
Forward
0 new messages