Hi
I'm trying to make an autocompletion, who gives higher score for typed word positions. Sorted by score and then name.
My goal:
typing "pet"
result:
peter christensen
peter christian grau
peter christian reumert krogsgaard
peter bruun christensen
anders petersen
typing "peter chr"
result:
peter christensen
peter christian grau
peter christian reumert krogsgaard
peter bruun christensen
Above succeed and I was happy, but then something strange happening, when there are duplicates "peter christensen". Now the result looks like this:
peter christian grau
peter christian reumert krogsgaard
peter christensen
peter christensen
peter bruun christensen
And I want this:
peter christensen
peter christensen
peter christian grau
peter christian reumert krogsgaard
peter bruun christensen
Please help?
Elasticsearch v. 5.5
Settings:
{
"persons_index": {
"settings": {
"index": {
"number_of_shards": "5",
"provided_name": "persons_index",
"creation_date": "1499881803116",
"analysis": {
"filter": {
"ascii_folding_preserve_original": {
"type": "asciifolding",
"preserve_original": "true"
},
"names_synonym_filter": {
"type": "synonym",
"synonyms": [
"aage,åge",
"gaard,gård"
]
}
},
"analyzer": {
"my_analyzer": {
"filter": [
"lowercase",
"trim",
"names_synonym_filter",
"ascii_folding_preserve_original"
],
"type": "custom",
"tokenizer": "standard"
}
}
},
"number_of_replicas": "1",
"uuid": "LxMHLha-R02i__S7gDWBtA",
"version": {
"created": "5050099"
}
}
}
}
}
Mapping:
{
"persons_index": {
"mappings": {
"persons_type": {
"properties": {
"fieldDisplayFullName": {
"type": "text",
"norms": false,
"analyzer": "my_analyzer"
},
"fieldSort": {
"type": "text",
"norms": false,
"analyzer": "keyword",
"fielddata": true
}
}
}
}
}
}
Example doc
{"fieldSort" : "peter christensen", "fieldDisplayFullName" : "Peter Christensen"}
Query:
_search?pretty=true&search_type=dfs_query_then_fetch
{
"explain": false,
"size" : 50,
"sort": [
"_score",
{
"fieldSort": {
"order": "asc"
}
}
],
"query": {
"bool" : {
"must" : {
"bool" : {
"minimum_should_match":"2",
"should" : [
{"match" : { "fieldDisplayFullName" : "peter" }},
{"wildcard" : { "fieldDisplayFullName" : "chr*" }}
]
}
},
"should" : [
{"match_phrase_prefix" : { "fieldSort" : {"query" : "peter chr","boost" : 10}}}
]
}
}
}
Result:
Peter Christensen (_score: 18.968887)
Peter Christian Engelhardt (_score: 18.968887)
Peter Christian Grau (_score: 18.968887)
Peter Christian Reumert Krogsgaard (_score: 18.968887)
Peter Christian Vagnbo Jørgensen (_score: 18.968887)
Peter Christoffersen (_score: 18.968887)
Peter Bruun Christensen (_score: 1.0512933)
Peter Dits Christensen (_score: 1.0512933)
Peter Fjeldsø Christensen (_score: 1.0512933)
With duplicates "Peter Christensen (_score: 14.909464)"
Peter Christian Engelhardt (_score: 20.01772)
Peter Christian Grau (_score: 20.01772)
Peter Christian Reumert Krogsgaard (_score: 20.01772)
Peter Christian Vagnbo Jørgensen (_score: 20.01772)
Peter Christoffersen (_score: 20.01772)
Peter Christensen (_score: 14.909464)
Peter Christensen (_score: 14.909464)
Peter Bruun Christensen (_score: 1.04652)
Peter Dits Christensen (_score: 1.04652)
Peter Fjeldsø Christensen (_score: 1.04652)
Diffrent query attemp with no success:
{
"explain": false,
"size" : 50,
"sort": [
"_score",
{
"fieldSort": {
"order": "asc"
}
}
],
"query": {
"bool" : {
"must" : {
"bool" : {
"minimum_should_match":"2",
"should" : [
{"match" : { "fieldDisplayFullName" : "peter" }},
{"wildcard" : { "fieldDisplayFullName" : "chr*" }}
]
}
},
"should" : [
{"span_first" : {
"match" : {
"span_term" : { "fieldDisplayFullName" : "peter" }
},
"end" : 1,
"boost" : 50.0
}},
{"span_first" : {
"match" : {
"span_multi":{
"match":{
"wildcard" : { "fieldDisplayFullName" : "chr*" }
}
}
},
"end" : 2,
"boost" : 50.0
}}
]
}
}
}