我尝试使用in the Solr docs所述的术语组件(请参阅使用术语组件进行自动建议功能)。
运行Solr 6.3.0。
我目前在索引中有4个文档:
{
"responseHeader":{
"status":0,
"QTime":0,
"params":{
"q":"*:*",
"indent":"on",
"wt":"json",
"_":"1482239790124"}},
"response":{"numFound":4,"start":0,"docs":[
{
"id":"1",
"title":["There's nothing better than a shiny red apple on hot summer day."],
"_version_":1554244409915080704},
{
"id":"2",
"title":["Eat an apple!"],
"_version_":1554244409917177856},
{
"id":"3",
"title":["I prefer a Grannie Smith apple over Fuji."],
"_version_":1554244409917177857},
{
"id":"4",
"title":["Apricots is kinda like a peach minus the fuzz."],
"_version_":1554244409917177858}]
}
}
我的字段定义如下(否则我的scheme.xml是vanilla):
<field name="title" type="strings" indexed="true" stored="true"/>
我的条款组件是默认的(就像我的整个solarconfig.xml一样):
<searchComponent name="terms" class="solr.TermsComponent"/>
<requestHandler name="/terms" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<bool name="terms">true</bool>
<bool name="distrib">false</bool>
</lst>
<arr name="components">
<str>terms</str>
</arr>
</requestHandler>
在执行http://localhost:8983/solr/test/terms?terms.fl=title&terms.prefix=ap
之类的请求时,我希望得到以下回复:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
</lst>
<lst name="terms">
<lst name="title">
<int name="apple">3</int>
<int name="Apricots">1</int>
</lst>
</lst>
</response>
但我实际得到的是一个空洞的回应。
当我改为http://localhost:8983/solr/test/terms?terms.fl=title&terms.prefix=Ea
时,我得到:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
</lst>
<lst name="terms">
<lst name="title">
<int name="Eat an apple!">1</int>
</lst>
</lst>
</response>
所以它有点工作,但不是不区分大小写,只是基于字符串的开头。
使其适用于title-field中包含的所有单词(如文档中所示)并使搜索不区分大小写。
indexed
和stored
;设置multiValued=false
;尝试type=string
。我猜测它与数据类型或Solr如何存储字段有关,但我无法弄明白。
答案 0 :(得分:1)
如果要在建立索引时小写字段的内容,则必须预先处理内容(在索引之前将其设置为小写),或者更容易,使用具有{{1}的字段类型}。该字段必须基于TextField,但您可以使用LowercaseFilter
将每个值保留为单个标记,而不是基于空格或类似内容进行标记。
条件处理程序只查找匹配的标记,因此通过使用KeywordTokenizer,您可以将所有内容保留为单个标记,并且LowercaseFilter可确保索引标记仅以小写形式保留。
如果你希望将内容中的每个术语分成它自己的标记,即杏,是,种类等,请使用WhitespaceTokenizer或StandardTokenizer以及LowercaseFilter。
答案 1 :(得分:0)
感谢Mats指出我正确的方向。
我的标题字段的字段类型确实是错误的,我需要使用另一个字段。创建自己的时候,我注意到默认的schema.xml有一堆预定义的字段类型,它们完全符合我的要求。
就我而言,我只想将我的字段类型设置为text_de:
<field name="title" type="text_de" indexed="true" stored="true"/>
text_de的预定义如下:
<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" format="snowball" words="lang/stopwords_de.txt" ignoreCase="true"/>
<filter class="solr.GermanNormalizationFilterFactory"/>
<filter class="solr.GermanLightStemFilterFactory"/>
</analyzer>
</fieldType>