Solr:按名称范围查询

时间:2012-01-23 15:44:07

标签: solr

我的问题如下: 我在Solr中有一大组用户索引。 我希望能够在每个范围内显示包含相同数量用户的姓氏范围,如下所示: Abar - Alac(这两个名字之间有X个用户) Alex - Amar(这两个名字之间的X用户) Atac - Azar(这两个名字之间有X个用户)

问题是如何使用solr查询查找范围?

还可以看出如何提取按字母顺序排序的名字,其中结果顺序模X = 0.

由于

3 个答案:

答案 0 :(得分:2)

我猜您正在寻找按字母顺序排列。 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 :(得分:1)

保存名称以及我在索引中描述的表示。你必须在索引之前在客户端计算它,但是这样的客户端选择性复制和数据非规范化是给Solr翅膀的东西。

对每个字母的2位数字编码名称的前三个字母:

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

现在您有一个6位数字字段,您可以在其间进行“搜索”。如果您想在beco之间进行搜索,只需在020500031500之间进行搜索即可。

这些数字也完美适用于范围刻面,即你可以将结果从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

答案 2 :(得分: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 ...