Связать многозначные поля в документе?

Скажем, у меня есть индекс клиентов 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: он не понимает этот тип поля.

В любом случае, проблемы с числовым полем определенно относятся к разным вопросам.

Удачи!

Другие вопросы по тегам