Lucene — связанные данные в разных полях

Я хочу реализовать текстовый поиск с помощью 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'

Существуют ли другие способы хранения связанных полей?


person EarlGrey    schedule 23.02.2014    source источник


Ответы (1)


Почему вы хотите использовать Lucene для этого? У вас есть дополнительные требования, которые требуют некоторых функций Lucene? Если нет, вам просто нужна структура данных «Карта». Ключ — это токен. Значение содержит список идентификаторов документов вместе со списком позиций.

person fatih    schedule 23.02.2014
comment
Я хочу реализовать поисковую систему. В будущем я хочу извлечь некоторую информацию из этих данных, поэтому я добавлю больше таблиц со встречающимися именами, местами, событиями... Хотя индекс Lucene является постоянным и оптимизированным для содержания тысяч записей. Карта находится здесь только во время выполнения, но она должна быть постоянной и эффективной. В конце концов я хочу сделать то, что вы предложили, но в Lucene. - person EarlGrey; 24.02.2014