asticsearch: можно ли определить синонимы с помощью boost?
Скажем A
, B
, C
являются синонимами, я хочу определить B
"ближе" к A
чем C
так что когда я ищу ключевое слово A
в результатах поиска, A
приходит первым, B
приходит второй и C
приходит последним
Любая помощь?
1 ответ
Не существует механизма времени поиска (пока), чтобы различать совпадения по синонимам и исходному полю. Это связано с тем, что при индексации синонимы поля помещаются в инвертированный индекс вместе с исходным термином, оставляя все слова равными.
Однако это не означает, что вы не можете совершать магию во время индексации, чтобы получить нужную информацию.
Создайте индекс с двумя анализаторами: один с фильтром синонимов, а другой без.
PUT /synonym_test/
{
settings : {
analysis : {
analyzer : {
"no_synonyms" : {
tokenizer : "lowercase"
},
"synonyms" : {
tokenizer : "lowercase",
filter : ["synonym"]
}
},
filter : {
synonym : {
type : "synonym",
format: "wordnet",
synonyms_path: "prolog/wn_s.pl"
}
}
}
}
}
Используйте отображение с несколькими полями, чтобы интересующее поле было проиндексировано дважды:
PUT /synonym_test/mytype/_mapping
{
"properties":{
"mood": {
"type": "multi_field",
"fields" : {
"syn" : {"type" : "string", "analyzer" : "synonyms"},
"no_syn" : {"type" : "string", "analyzer" : "no_synonyms"}
}
}
}
}
Индексируйте тестовый документ:
POST /synonym_test/mytype/1
{
mood:"elated"
}
Во время поиска увеличьте количество попаданий на поле без синонимов.
GET /synonym_test/mytype/_search
{
query: {
bool: {
should: [
{ match: { "mood.syn" : { query: "gleeful", "boost": 3 } } },
{ match: { "mood.no_syn" : "gleeful" } }
]
}
}
}
Результаты в _score":0.2696457
Поиск оригинального термина возвращает лучший результат:
GET /synonym_test/mytype/_search
{
query: {
bool: {
should: [
{ match: { "mood.syn" : { query: "elated", "boost": 3 } } },
{ match: { "mood.no_syn" : "elated" } }
]
}
}
}
Результаты: _score ": 0.6558018,"