ElasticSearch query/search/match -
i have inserted 3 records in elasticsearch index follows:
curl -xpost 'http://127.0.0.1:9200/geoindex_test/street?pretty=1' -d ' { "citynames" : [ { "language" : "eng", "name" : "w bridgewater", "raw_name" : "w bridgewater" }, { "language" : "eng", "name" : "west bridgewater", "raw_name" : "west bridgewater" } ], "id" : 1, "streetnames" : [ { "language" : "eng", "name" : "cram rd", "raw_name" : "cram rd" } ] }' curl -xpost 'http://127.0.0.1:9200/geoindex_test/street?pretty=1' -d ' { "citynames" : [ { "language" : "eng", "name" : "bridgewater corners", "raw_name" : "bridgewater corners" }, { "language" : "eng", "name" : "bridgewater center", "raw_name" : "bridgewater center" } ], "id" : 2, "streetnames" : [ { "language" : "eng", "name" : "valley view rd", "raw_name" : "valley view rd" } ] }' curl -xpost 'http://127.0.0.1:9200/geoindex_test/street?pretty=1' -d ' { "citynames" : [ { "language" : "eng", "name" : "bridgewater", "raw_name" : "bridgewater" }, { "language" : "eng", "name" : "windsor", "raw_name" : "windsor" } ], "id" : 3, "streetnames" : [ { "language" : "eng", "name" : "valley view rd", "raw_name" : "valley view rd" } ] }'
and perform search follows:
curl -xget 'http://127.0.0.1:9200/geoindex_test/street/_search?pretty=1' -d ' { "query" : { "match" : { "citynames.name" : "bridgewater" } } }'
i thought elasticsearch return third record (id == 3) best match (record 3 exact match "bridgewater"), instead returns record id 1 (w bridgewater) best match. doing wrong?
i imagine happening because using inner objects collapse objects under it, 1 search purposes. when you're querying search field object 1, example, you're querying against ["w bridgewater", "west bridgewater"] , not discrete fields may imagine.
since 'bridgewater' appears twice in object 1 , 2 (two name fields) vs once in object 3, items rank higher in search. object 1 picked, because fields 'bridgewater' appears in shorter strings in object 2 ("w bridgewater" vs "bridgewater corners").
instead of using inner objects you're doing, use nested objects instead http://www.elasticsearch.org/guide/reference/mapping/nested-type/. setting score mode "max" make things match in more intuitive manner you.
Comments
Post a Comment