У меня есть индекс с франшизами фильмов, и я бы хотел, чтобы точные совпадения слов / фраз были выше. Например, если я ищу "Star Trek"
, я хочу, чтобы "Star Trek"
набрал наивысший результат (первый результат), за которым следуют "Star Trek Beyond"
и "Star Trek Into Darkness"
. В настоящее время, когда я ищу "Star Trek"
, я получаю заголовки с дополнительными словами, набравшими больше очков. Это возможно и как?
Также возможно ли получить те же результаты, как описано выше, если вокруг поискового запроса есть некоторый дополнительный несопоставленный текст, например: "(randomText) Star Trek (randomText)"
Вот мои настройки / сопоставления:
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"properties": {
"title_english": {
"type": "text",
"fields": {
"raw": { "type": "keyword" },
"space": { "type": "text", "analyzer": "whitespace" }
},
"analyzer": "autocomplete"
},
"title_native": {
"type": "text",
"fields": {
"raw": { "type": "keyword" },
"space": { "type": "text", "analyzer": "whitespace" }
},
"analyzer": "autocomplete"
},
"title_romaji": {
"type": "text",
"fields": {
"raw": { "type": "keyword" },
"space": { "type": "text", "analyzer": "whitespace" }
},
"analyzer": "autocomplete"
},
"title_synonyms": {
"type": "text",
"fields": {
"raw": { "type": "keyword" },
"space": { "type": "text", "analyzer": "whitespace" }
},
"analyzer": "autocomplete"
}
}
}
}
А вот и мой запрос:
'query': {
'bool': {
'must': {
'multi_match': {
'query': request.args.get('query'),
'analyzer': 'standard',
'fields': ['title_*']
},
},
'should': [{
'term': {
'title_*.raw': {
'value': request.args.get('query'),
'boost': 3
}
}
},
{
'prefix': {
'title_*.raw': {
'value': request.args.get('query'),
'boost': 2
}
}
}]
}
}