У меня есть набор документов, содержащих оцененные элементы, которые я хотел бы проиндексировать. Наша структура данных выглядит так:
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 с Score == 1 может быть добавлен три раза, а RelatedScore с Score ==. 3 может быть добавлен только один раз.
И то, и другое приведет к потере точности поиска по этим полям, да, но они могут быть достаточно хорошими. Есть мысли по этому поводу?