Связать многозначные поля в документе? - PullRequest
0 голосов
/ 14 июля 2011

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

0 голосов
/ 14 июля 2011

Похоже, что запросы, которые вам нужны, должны содержать каждую отдельную транзакцию в качестве документа.Таким образом, для приведенного вами примера данные будут выглядеть следующим образом:

<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: он не понимает этот тип поля.

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

Удачи!

...