Ответы до сих пор касались деталей, но если Вы не предназначаете к выпадающему к блоку, затем все, что необходимо знать, то, что и вызывающая сторона и вызываемый должны использовать то же соглашение о вызовах, иначе Вы получите ошибки, которые трудно найти.
Похоже, вам нужно объединить индексы в коде. Если я правильно понимаю, при поиске термина могут быть совпадения либо с текстом документа, либо с тегами, и каждый тег индексируется с соответствующими идентификаторами документов. После этого у вас будет два списка совпадений, которые нужно объединить. Поскольку теги и полный текст - очень разные сущности, вам потребуется некоторое взвешивание (возможно, в виде увеличения поля во время поиска), чтобы достичь хорошего ранжирования. Таким образом, вы можете объединить попадание тега и попадание полного текста для документа k, используя формулу вида:
score (k) = a * tagscore (k) + b * fulltextscore (k)
Где a и b будут эмпирически определенные коэффициенты.
Для более подробного обсуждения см. статьи Гранта Ингерсолла о возможности поиска и , отлаживающие проблемы релевантности в поисковых статьях
.Основная проблема с этим подходом связана с ранжированием документов, поскольку алгоритм по умолчанию (и, вероятно, большинство пользовательских алгоритмов, за некоторыми исключениями) основаны на частоте термина и обратной частоте документов.
Другими словами, Секретарь должен знать, сколько раз термин встречается в документе, а также сколько других документов содержат этот термин. Эта информация сохраняется для каждого термина в индексе, но не для совокупности по нескольким индексам.
Общее решение этой проблемы - двухэтапный подход. Сначала выполняется запрос к каждому индексу, чтобы определить, сколько документов содержит каждый термин. Затем результаты объединяются, и запрос выполняется снова, но на этот раз вместе с ним отправляется обратная частота документа.
Как вы понимаете, это победило.
В Lucene есть тип IndexReader
для поддержки этой схемы - ParallelReader
.
Это может быть немного сложно использовать, поскольку идентификатор документа Lucene для записи должен быть одинаковым в обоих индексах. На практике это означает добавление документов в одном и том же порядке в оба индекса. Я читал, что в некоторых случаях удаление документа и оптимизация индекса могут заставить Lucene переназначить эти идентификаторы документов, но я не экспериментировал, чтобы выяснить, правда ли это. При изменении существующих записей может потребоваться дополнительная осторожность. Если добавляются только новые записи, проблем возникнуть не должно.
Этот подход обычно называют «вертикальным разделением», в отличие от «горизонтального разделения» или сегментирования.