2012-01-23 4 views
0

Моя проблема заключается в следующем: У меня есть большой набор пользователей, проиндексированных в Solr. Я хотел бы иметь возможность отображать диапазон последних имен, содержащих в каждом диапазоне, такое же количество пользователей, что-то вроде этого: Abar - Alac (X пользователей между этими двумя именами) Alex - Amar (X пользователей между этими двумя именами) Atac - Azar (X пользователей между этими двумя именами)Solr: Запрос по диапазону имени

Проблема заключается в том, как найти диапазон с запросом solr?

Это можно рассматривать и как способ извлечения ПгвЬЫата в алфавитном порядке, где результат порядка по модулю X = 0.

Благодаря

+2

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

+0

Я согласен с Роб Ди Марко. Мне неизвестно, что Solr, который может разрешить диапазоны фасет с равным количеством отсчетов. (Его больше похоже на обратную фасетную функцию, где вы указываете счетчик и получаете диапазоны) – Omnaest

ответ

1

Я предполагаю, что вы ищете алфавитного Range Bucketing. В Solr нет функции, которая предоставляет эту функцию из коробки. Но вы можете использовать творческий взлом с дополнительным шагом анализа текста. Это следующее может помочь в вашем случае,

Создание Тип поля: letterRangeFieldType

<fieldType name="letterRangeFieldType" class="solr.TextField"> 
    <analyzer type="index"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="^([a-zA-Z]).*" group="1" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="letterRanges.txt" ignoreCase="true" expand="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
</analyzer> 
</fieldType> 

Создание поля с этим типом поля:

<field name="firstNameFacetLetter" type="letterRangeFieldType" stored="false" /> 

Создать копию поля, которая копирует первые имена в новое поле который будет вестись:

<copyField source="firstName" dest="firstNameFacetLetter" /> 

Подводя итог, e PatternTokenizerFactory берет первый символ от имени и сопоставляет его с базой диапазона в диапазоне синонимов, определенных в synonyms="letterRanges.txt". Например, имя с Foo будет отображаться на D - F.

Наконец, вы можете запустить фасет в новом поле с сортировкой по lex. Вы получите результаты, как это так,

<lst name="firstNameFacetLetter"> 
    <int name="A-C">99</int> 
    <int name="D-F">76</int> 
    <int name="G-I">52</int> 
    ... 

Вам нужно настроить, чтобы соответствовать вашим требованиям диапазоны &, но это может помочь вам.

+0

Благодарим вас за ответ, но я думаю, что я был неясно с проблемой, если есть. У меня много пользователей, начиная с A. Я хочу разбить результат на самом деле. Мне просто нужно выполнить поиск имени, начинающегося с A, а затем я хотел бы получить первый результат, X-й результат, результат Xth + 1, результат 2xX и т. Д. Поэтому я могу получить диапазон, как я описываю в моем вопросе. – KaipiYann

1

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

Encode первые три буквы имени с 2 цифры для каждой буквы:

Abu -- 01 02 21 
George -- 07 05 15 

Теперь у вас есть 6-значное числовое поле, что вы можете сделать «поиск между». Если вы хотите найти от be до co, просто найдите от 020500 до 031500.

Эти цифры отлично подходят к огранке огней, т. Е. Вы можете разделить результаты от a до b, b и c и т. Д.

Некоторые фильтры:

[a,ae] needs bucket:[010000 TO 010500] 
[ae-b], 50 results from 100 needs bucket:[010500 TO 020000]&start=100&rows=50 
[b-c] needs bucket:[020000 TO 030000] 
[b-c], 4th result needs bucket:[020000 TO 030000]]&start=4&rows=1 
+0

Благодарим вас за ответ, но я думаю, что я был неясно с проблемой, если есть. У меня много пользователей, начиная с A. Я хочу разбить результат на самом деле. Мне просто нужно выполнить поиск имени, начинающегося с A, а затем я хотел бы получить первый результат, X-й результат, результат Xth + 1, результат 2xX и т. Д. Поэтому я могу получить диапазон, как я описываю в моем вопросе. – KaipiYann

+0

обновлено согласно вашему запросу – aitchnyu

1

ответ mailboat в сделал почти работает для меня, но нужно немного подправить в моем Solr:

Определение типа:

<fieldType name="vendorNameRangeFieldType" class="solr.TextField"> 
    <analyzer> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="vendorNameLetterRanges.txt" ignoreCase="true" expand="true"/> 
</analyzer> 
</fieldType> 

Определение поля:

<field name="vendorNameFacetLetter" type="vendorNameRangeFieldType" indexed="true" stored="true" /> 

Копирование содержимого в поле:

<copyField source="Title_prop" dest="vendorNameFacetLetter" maxChars="1"/> 

и содержание моего синонима файла:

a,b,c,d => AD 
e,f,g,h => EH 
i,j,k,l => IL 
m,n,o,p => MP 
q,r,s,t => QT 
u,v,w,x,y,z => UZ 

Это создает новое поле из содержимого поля Title_prop (используя это только первый символ), а затем вы можете фильтровать по этой новой области с использованием AD, EH и т.д. группы, такие как:

... &fq=vendorNameFacetLetter:QT ... 
Смежные вопросы