Группировка результатов поиска Lucene и расчет частоты по категориям - PullRequest
3 голосов
/ 11 апреля 2009

Я работаю над API поиска в магазине, используя Lucene.

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

Los Angles,CA (450)
Atlanta,GA (212)
Boston, MA (78)
.
.
.

На данный момент мои результаты поиска возвращают в среднем около 7000 документов Lucene, если пользователь говорит «Покажите мне все магазины». В этом случае я получаю около 800 уникальных записей по городам и штатам, как показано выше.

Я переопределяю метод Collect класса HitCollector и получаю векторы следующим образом:

var vectors = _reader.GetTermFreqVectors(doc);

Затем я перебираю эту коллекцию и вычисляю частоту для каждой уникальной комбинации «Город, штат».

Но это оказывается очень-очень медленным по производительности ... Есть ли лучший способ группировки результатов поиска и расчета частоты в Lucene? Фрагмент кода будет очень полезен

Также, пожалуйста, предложите, если я могу оптимизировать свой код поиска Lucene, используя любые другие методы / советы ....

Спасибо за чтение!

Ответы [ 3 ]

3 голосов
/ 11 апреля 2009

Я не верю, что вы можете сделать это OOTB в Lucene в настоящее время - поиск этой функции приводит к открытому вопросу:

Запрос функции Jira Lucene

Функциональность присутствует OOTB с Solr однако - которая обеспечивает функцию огранки. Запрос, такой как следующий:

http://localhost:8983/solr/select?q=ipod&rows=0&facet=true&facet.limit=-1&facet.field=cat&facet.field=inStock

вернет следующий результат:

<response>
<responseHeader><status>0</status><QTime>2</QTime></responseHeader>
<result numFound="4" start="0"/>
<lst name="facet_counts">
 <lst name="facet_queries"/>
 <lst name="facet_fields">
  <lst name="cat">
        <int name="search">0</int>
        <int name="memory">0</int>
        <int name="graphics">0</int>
        <int name="card">0</int>
        <int name="music">1</int>
        <int name="software">0</int>
        <int name="electronics">3</int>
        <int name="copier">0</int>
        <int name="multifunction">0</int>
        <int name="camera">0</int>
        <int name="connector">2</int>
        <int name="hard">0</int>
        <int name="scanner">0</int>
        <int name="monitor">0</int>
        <int name="drive">0</int>
        <int name="printer">0</int>
  </lst>
  <lst name="inStock">
        <int name="false">3</int>
        <int name="true">1</int>
  </lst>
 </lst>
</lst>
</response>

Более подробную информацию о огранке можно найти на веб-сайте Solr:

http://wiki.apache.org/solr/SimpleFacetParameters

РЕДАКТИРОВАТЬ: Если вы определенно не хотите переходить от подхода SOLR к огранке, вы можете использовать функциональность, описанную в этом патче для Lucene:

http://sujitpal.blogspot.com/2007/01/faceted-searching-with-lucene.html

, которая обеспечивает реализацию функции огранки поверх Lucene 2.0 через патч.

0 голосов
/ 12 апреля 2009

Стив, я думаю, вы хотите граненый поиск . Это не выходит из коробки с Lucene. Я советую вам попробовать SOLR , у которого огранка как основная и удобная функция

0 голосов
/ 11 апреля 2009

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

Мой ответ там до сих пор стоит, хотя никому, похоже, не нравилось это, чтобы поднять мне голос ...

...