У меня есть набор документов, содержащий отмеченные объекты, которые я хотел бы проиндексировать. Наша структура данных выглядит так:
Document
ID
Text
List<RelatedScore>
RelatedScore
ID
Score
Моей первой мыслью было добавление каждого RelatedScore в качестве многозначного поля с использованием свойства Boost поля для изменения значения конкретной оценки при поиске.
foreach (var relatedScore in document.RelatedScores) {
var field = new Field("RelatedScore", relatedScore.ID,
Field.Store.YES, Field.Index.UN_TOKENIZED);
field.SetBoost(relatedScore.Score);
luceneDoc.Add(field);
}
Однако, похоже, что вычисленная «норма» применяется ко всему мультиполю - все значения RelatedScore для документа в итоге получат одинаковую оценку.
Есть ли в Lucene механизм, позволяющий использовать эту функцию? Я бы предпочел не создавать другой индекс только для учета этого - такое ощущение, что должен быть способ использовать один индекс. Если нет средств для достижения этой цели, несколько идей, которые мы должны компенсировать:
- Вставка элементов поля с несколькими значениями в порядке убывания значения. Затем каким-то образом добавьте позиционно-ориентированный анализ, чтобы присвоить более высокий импульс / оценку первым предметам в поле.
- Добавить высокий балл оценки несколько раз в поле. Таким образом, RelatedScore со счетом == 1 можно добавить три раза, а RelatedScore со счетом ==. 3 можно добавить только один раз.
Оба из них приведут к потере точности поиска в этих полях, да, но они могут быть достаточно хорошими. Есть мысли по этому поводу?