Какова лучшая настройка Lucene для ранжирования точных совпадений как самых высоких? - PullRequest
6 голосов
/ 09 января 2012

Какие анализаторы следует использовать для индексации и поиска, когда я хочу, чтобы точное совпадение оценивалось выше, чем "частичное" совпадение?Возможно настроить настраиваемую оценку в классе Similarity?

Например, когда мой индекс состоит из car parts, car и car shop (индексируется с StandardAnalyzer в lucene 3.5), aзапрос для "car" приводит к:

  • автозапчасти
  • авто
  • автомагазин

(в основном возвращается в заказе вкоторые были добавлены, так как все они получают одинаковый балл).

Я хотел бы видеть, что car занимает первое место, затем другие результаты (не имеет значения, в каком порядке, я полагаю, анализаторможет влиять на это).

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Все три совпадения точные (термин соответствует автомобилю, а не 'ca' или 'ar') :)

Если в этих полях больше нет содержимого («автозапчасти», «автомобиль» и «автомагазин»), вы можете использовать lengthNorm() или computeNorm() (в зависимости от версии Lucene), чтобы более короткие поля были более вес, так что машина получает более высокий балл за то, что она короче. В Lucene 3.3.0 DefaultSdentifity.computeNorm () выглядит следующим образом:

return state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));

где numTerms - общее количество терминов в поле. Поэтому удивительно, что документы «car» и «car shop» имеют одинаковую оценку, потому что для «car» норма равна 1, а для «car shop» она должна быть 0,7 (при условии повышения 1).

0 голосов
/ 09 января 2012

Быстрый взлом: после получения ScoreDoc[] из IndexSearcher.search, пересортируйте его с score в качестве первого критерия и длиной (по возрастанию) в качестве второго.

...