Solr: запрос по диапазону имен - PullRequest
0 голосов
/ 23 января 2012

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

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

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

Спасибо

Ответы [ 3 ]

2 голосов
/ 23 января 2012

Полагаю, вы ищете Буквенный диапазон .В 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" />

Для суммирования, при индексации 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>
  ...

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

1 голос
/ 22 мая 2013

ответ почтовой шлюпки у меня почти сработал, но в моем 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 ...
1 голос
/ 23 января 2012

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

Кодируйте первые три буквы имени по 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...