Связать многозначные поля в документе?
Скажем, у меня есть индекс клиентов Lucene. У каждого клиента есть товары, которые они заказали.
Допустим, эти две парни представляют два документа в моем индексе:
Name: John Smith
Product: Chicken Sandwich, Price: $10
Product: Dodge Challenger, Price: $35000
Name: John Q. Public
Product: Chicken Sandwich, Price: $15
Product: Audi TT, Price: $35000
Учитывая, что мой индекс ориентирован на клиента, а не на заказ, мои документы, вероятно, будут выглядеть так:
<add>
<doc>
<field name="Name">John Smith</field>
<field name="Product">Chicken Sandwich</field>
<field name="Price">10</field>
<field name="Product">Dodge Challenger</field>
<field name="Price">35000</field>
</doc>
<doc>
<field name="Name">John Q. Public</field>
...
Который в итоге объединил бы все цены и продукты в многозначные поля и потерял бы их относительные ассоциации.
Как бы я включил это в свой индекс - и как я бы запросил его - так, чтобы поиск "Каждый клиент, который заплатил более 12 долларов за сэндвич с курицей", вернул бы только John Q. Public?
1 ответ
Похоже, что запросы, которые вам нужны, должны содержать каждую отдельную транзакцию в качестве документа. Таким образом, для приведенного вами примера данные будут выглядеть так:
<add>
<doc>
<field name="Name">John Smith</field>
<field name="Product">Chicken Sandwich</field>
<field name="Price">10</field>
</doc>
<doc>
<field name="Name">John Smith</field>
<field name="Product">Dodge Challenger</field>
<field name="Price">35000</field>
</doc>
<doc>
<field name="Name">John Q. Public</field>
Учитывая приведенную выше схему, вот возможный синтаксис запроса для вашего примера:
Product:"Chicken Sandwich" AND Price:[00000000 TO 00001200]
Для получения дополнительной информации документация Lucene работает лучше, чем я когда-либо мог!
Единственная ложка этой мази - тип данных поля цены. С точки зрения написания наименьшего кода, если вы храните его как строку с нулевой подкладкой (вероятно, в центах, если я понимаю американскую денежную систему!), Это наиболее простой подход. Однако наиболее эффективный подход (который может быть важен в зависимости от того, сколько транзакций у вас может быть) - это использовать числовое поле (опять же, с центами). Проблема возникает при использовании анализатора запросов Lucene: он не понимает этот тип поля.
В любом случае, проблемы с числовым полем определенно относятся к разным вопросам.
Удачи!