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,"

Другие вопросы по тегам