我的问题如下: 我在Solr中有一大组用户索引。 我希望能够在每个范围内显示包含相同数量用户的姓氏范围,如下所示: Abar - Alac(这两个名字之间有X个用户) Alex - Amar(这两个名字之间的X用户) Atac - Azar(这两个名字之间有X个用户)
问题是如何使用solr查询查找范围?
还可以看出如何提取按字母顺序排序的名字,其中结果顺序模X = 0.
由于
答案 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位数字字段,您可以在其间进行“搜索”。如果您想在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
答案 2 :(得分:1)
类型定义:
<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 ...