Search for name(text) with spaces in elasticsearch
You can use the multi field type, a bool query and the custom boost factor query to solve this problem.
Mapping:
{ "mappings" : { "user" : { "properties" : { "name": { "type": "multi_field", "fields": { "name": { "type" : "string", "index": "analyzed" }, "exact": { "type" : "string", "index": "not_analyzed" } } } } } }}
Query:
{ "query": { "bool": { "must": [ { "match": { "name": "Maaz Tariq" } } ], "should": [ { "custom_boost_factor": { "query": { "term": { "name.exact": "Maaz Tariq" } }, "boost_factor": 15 } }, { "custom_boost_factor": { "query": { "prefix": { "name.exact": "Maaz Tariq" } }, "boost_factor": 10 } }, { "custom_boost_factor": { "query": { "match_phrase": { "name": { "query": "Maaz Tariq", "slop": 0 } } }, "boost_factor": 5 } } ] } }}
edit:
As pointed out by javanna, the custom_boost_factor
isn't needed.
Query without custom_boost_factor
:
{ "query": { "bool": { "must": [ { "match": { "name": "Maaz Tariq" } } ], "should": [ { "term": { "name.exact": { "value": "Maaz Tariq", "boost": 15 } } }, { "prefix": { "name.exact": { "value": "Maaz Tariq", "boost": 10 } } }, { "match_phrase": { "name": { "query": "Maaz Tariq", "slop": 0, "boost": 5 } } } ] } }}
In case of Java Api, when quering exact strings with spaces use;
CLIENT.prepareSearch(index) .setQuery(QueryBuilders.queryStringQuery(wordString) .field(fieldName));
In a lot of other queries, you get nothing as result
And from Elasticsearch 1.0:
"title": { "type": "multi_field", "fields": { "title": { "type": "string" }, "raw": { "type": "string", "index": "not_analyzed" } }}
became:
"title": { "type": "string", "fields": { "raw": { "type": "string", "index": "not_analyzed" } }}
https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html