Я хочу реализовать текстовый поиск с помощью Lucene по некоторым документам. Документы предоставляются уже токенизированными в таблице:|documentID|token|position|
'documentID' - это идентификатор документа, в котором находится токен
'position' описывает, на какой позиции в документе записан токен
Моей первой попыткой было создать индекс для поиска токенов и возврата идентификатора документа. Поэтому я создал документ Lucene для каждого идентификатора документа. К каждому документу Lucene я добавил один «documentID» IntField и несколько «токенов» StringField для каждого токена в этом документе. Поэтому нет проблем.
Теперь я начал вторую попытку, включая информацию о местоположении. Первая мысль: «Нет проблем, просто добавьте «позицию» StringFields в документ Lucene!» Но... Тогда я не имею отношения между позициями и токенами. Вот пример того, что я хочу в итоге:INPUT:
tomato
OUTPUT:
docID1|position1
docID1|position2
docID2|position1
...
Как я могу этого добиться? На мой взгляд, самым простым решением было бы прекратить преобразование документа->Lucene-document и начать сопоставлять отдельные токены с Lucene-документами.
Поэтому я создаю Lucene-документ для каждой уникальной комбинации токена/documentID (конечно, просто для идентификаторов документов, содержащих токен). Затем я добавляю токен и идентификатор документа в качестве полей в документ. Кроме того, для каждого попадания IntField содержит 'position' из таблицы.
Пример:
StringField 'token1'
IntField 'documentID1'
IntField 'position1'
IntField 'position2'
IntFIeld 'position3'
StringField 'token1'
IntField 'documentID2'
IntField 'position1'
IntField 'position2'
Существуют ли другие способы хранения связанных полей?