У меня есть индексasticsearch, и я использую следующий запрос:
"_source": [
"title",
"content"
],
"size": 15,
"from": 0,
"query": {
"bool": {
"must": {
"multi_match": {
"query": "{{query}}",
"fields": [
"title",
"content"
],
"operator": "or"
}
},
"should": [
{
"multi_match": {
"query": "{{query}}",
"fields": [
"title.standard^16",
"content.standard^2"
],
"operator": "and"
}
},
{
"match_phrase": {
"content.standard": {
"query": "{{query}}",
"_name": "Phrase on title",
"boost": 1000
}
}
}
]
}
},
"highlight": {
"fields": {
"content": {}
},
"fragment_size": 100
}
}
Вот отображение, которое я установил:
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"my_metaphone"
]
}
},
"filter": {
"my_metaphone": {
"type": "phonetic",
"encoder": "metaphone",
"replace": true
}
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"term_vector": "with_positions_offsets",
"analyzer": "my_analyzer",
"fields": {
"standard": {
"type": "text"
},
"stemmer": {
"type": "text",
"analyzer": "english"
}
}
},
"content": {
"type": "text",
"term_vector": "with_positions_offsets",
"analyzer": "my_analyzer",
"fields": {
"standard": {
"type": "text"
},
"stemmer": {
"type": "text",
"analyzer": "english"
}
}
}
}
}
}
Вот мои логики c с запросом :
1) Это даст наивысший приоритет фразе, если она появится.
2) Если нет, он будет использовать стандартный анализатор (то есть текст, как есть) и присвоит ему наивысший приоритет.
3) Если все остальное не совпадает, он использует анализатор phoneti c для получения результатов, что является наименьшим приоритетом.
Но, очевидно, в этом есть какая-то ошибка, так как он, похоже, отдает приоритет анализатору phoneti c, чем стандарту или фразе. Например, если я ищу «Человек индийского происхождения», он возвращает результаты вверху, выделяя «Преследующий» «преследуя» и очень, очень меньшее количество результатов с человеком индийского происхождения, хотя я знаю, что существует большое их количество. Как мне это решить?