Lucene индексируют с несколькими полями аналогичного характера

Каждый документ Lucene является рецептом, и каждый из этих рецептов имеет компоненты.

Я работаю для способности искать компоненты и дать результат, который говорит что два компонента, подобранные из четыре. (например),

Таким образом, как я могу добавить компоненты к документу? В solr я могу просто создать несколько полей, и он сохранил бы их всех, я мог бы делать что-то не так потому что его единственное сохранение одного компонента.

Также это относилось бы к полю как 'теги'.

p.s я использую Платформу Зенда для этого, если это имеет значение вообще.

7
задан bluedaniel 9 March 2010 в 15:43
поделиться

2 ответа

Документы Lucene поддерживают добавление нескольких одноименных полей. Т.е. вы можете многократно вызывать:

document.add(new Field("name"), value) 

Так что если вы сделаете :

# (pseudo-code) 
document1.add(new Field("ingredient"), "vanilla") 
document1.add(new Field("ingredient"), "strawberry") 
index.add(document)

# And then search for
index.search("ingredient", "vanilla" && "strawberry")

Вы получите обратно document1. Но если вы выполните поиск:

index.search("ingredient", "vanilla" && "apple")

Вы не получите обратно document1.

Если вы ищете:

index.search("ingredient", "vanilla" || "apple")

Вы также получите document1.

Если вы хотите посмотреть, какие ингредиенты совпадают, вы можете просто сохранить поля документа как сохраненные поля, а затем для каждого совпадающего документа получить список полей и сравнить их с запросом пользователя.

Также обратите внимание, что по умолчанию PositionIncrementGap для полей с одинаковым именем, добавляемых в документ, равен 0.

Это означает, что если вы добавите:

   document1.add(new Field("ingredient"), "chocolate") 
   document1.add(new Field("ingredient"), "orange") 

то это будет рассматриваться как один ингредиент под названием "шоколадный апельсин", который может совпасть по :

index.search("ingredient", "chocolate orange")

Вы можете избежать этого, установив значение PositionIncrementGap > 1, что даст:

0 совпадений для:

index.search("ingredient", "chocolate orange")

и 1 совпадение для:

index.search("ingredient", "chocolate" &&  "orange")
14
ответ дан 6 December 2019 в 15:20
поделиться

Я вижу здесь два возможных подхода:

  1. Денормализуйте свои данные - создайте отдельный документ для каждого ингредиента в рецепте, предоставив все документы для рецепта ac ommon идентификатор рецепта. Затем во время поиска объедините все совпадения идентификатора рецепта. Немного некрасиво.
  2. Объедините все ваши ингредиенты в общее поле и проиндексируйте его как «Текст». Затем найдите ингредиенты, используя логический запрос с «ИЛИ» (в терминах Java Lucene это называется «Должен», я не знаю эквивалента в PHP).

Я предлагаю вам попробовать второй подход и посмотреть, поможет ли он.

0
ответ дан 6 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: