ElasticSearch edgeNGram for autocomplete \ typeahead, my search_analyzer id is ignored

I have three documents with the "userName" field:

  • 'briandilley'
  • 'briangumble'
  • 'briangriffen'

when I search for 'brian', I get all three back as expected, but when I search for 'briandilley', I still get all three. The analysis API tells me that it uses the ngram filter in my search bar, but I'm not sure why. here is my setup:

Index Settings:

{ "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 } } } } 

display:

 { "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" } } } } } } 

Search:

 { "from" : 0, "size" : 50, "query" : { "bool" : { "must" : [ { "field" : { "targetId" : "51888c1b04a6a214e26a4009" } }, { "match" : { "userName.autocomplete" : { "query" : "brian", "type" : "boolean" } } } ] } }, "fields" : "followerId" } 

I tried matchQuery, matchPhraseQuery, textQuery and termQuery (java DSL api) and get the same results every time.

+6
source share
1 answer

I think you are not doing what you think, what you think. This is why it is useful to present an actual test case with full curl statements rather than an abbreviation.

Your example above works for me (slightly modified):

Create an index with settings and display:

 curl -XPUT 'http://127.0.0.1:9200/test/?pretty=1' -d ' { "mappings" : { "test" : { "properties" : { "userName" : { "fields" : { "autocomplete" : { "search_analyzer" : "username_search", "index_analyzer" : "username_index", "type" : "string" }, "userName" : { "index" : "not_analyzed", "type" : "string" } }, "type" : "multi_field" } } } }, "settings" : { "analysis" : { "filter" : { "username_ngram" : { "max_gram" : 15, "min_gram" : 1, "type" : "edge_ngram" } }, "analyzer" : { "username_index" : { "filter" : [ "lowercase", "username_ngram" ], "tokenizer" : "keyword" }, "username_search" : { "filter" : [ "lowercase" ], "tokenizer" : "keyword" } } } } } ' 

Indicate some data:

 curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d '{ "userName" : "briangriffen" } ' curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d ' { "userName" : "brianlilley" } ' curl -XPOST 'http://127.0.0.1:9200/test/test?pretty=1' -d ' { "userName" : "briangumble" } ' 

A brian search finds all documents:

 curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d '{ "query" : { "match" : { "userName.autocomplete" : "brian" } } } ' # { # "hits" : { # "hits" : [ # { # "_source" : { # "userName" : "briangriffen" # }, # "_score" : 0.1486337, # "_index" : "test", # "_id" : "AWzezvEFRIykOAr75QbtcQ", # "_type" : "test" # }, # { # "_source" : { # "userName" : "briangumble" # }, # "_score" : 0.1486337, # "_index" : "test", # "_id" : "qIABuMOiTyuxLOiFOzcURg", # "_type" : "test" # }, # { # "_source" : { # "userName" : "brianlilley" # }, # "_score" : 0.076713204, # "_index" : "test", # "_id" : "fGgTITKvR6GJXI_cqA4Vzg", # "_type" : "test" # } # ], # "max_score" : 0.1486337, # "total" : 3 # }, # "timed_out" : false, # "_shards" : { # "failed" : 0, # "successful" : 5, # "total" : 5 # }, # "took" : 8 # } 

A search for brianlilley only finds this document:

 curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d ' { "query" : { "match" : { "userName.autocomplete" : "brianlilley" } } } ' # { # "hits" : { # "hits" : [ # { # "_source" : { # "userName" : "brianlilley" # }, # "_score" : 0.076713204, # "_index" : "test", # "_id" : "fGgTITKvR6GJXI_cqA4Vzg", # "_type" : "test" # } # ], # "max_score" : 0.076713204, # "total" : 1 # }, # "timed_out" : false, # "_shards" : { # "failed" : 0, # "successful" : 5, # "total" : 5 # }, # "took" : 4 # } 
+9
source

Source: https://habr.com/ru/post/944411/


All Articles