我正在尝试使用solr文档中所述的术语组件(请参见使用auto-suggest功能的component )。
先决条件
运行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}]
}
}
我的字段定义看起来像这样(否则我的spech.xml是香草):
<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>
因此,它是一种有效的工作,但对细节不敏感,仅基于字符串的开头。
目标
使其适用于标题场中包含的所有单词(例如在文档中),并使搜索案例不敏感。
试图解决它
- 我弄乱了标题场:显式设置
indexed
和stored
;设置multiValued=false
;尝试了type=string
。 - 我尝试了各种术语组件参数
- 尝试实施与方面相似的东西(请参阅文档),但遇到了相同的问题。
我猜这与数据类型有关或索尔存储该字段有关系,但我无法弄清楚。
如果要在索引时较低范围的字段中的内容,则必须预处理内容(在索引之前将其放大),或更容易使用,请使用该字段类型有一个LowercaseFilter
。该字段必须基于文本字段,但是您可以使用KeywordTokenizer
将每个值作为单个令牌保留,而不是基于Whitespace或类似的东西被令牌化。
术语处理程序只是寻找匹配的代币,因此,通过使用关键字键语,您可以将所有内容保持为单个令牌,并且LowerCaseFilter确保索引令牌仅保留在小写中。
但是,如果您想要想要将内容中的每个术语划分为自己的令牌,即杏子,善良等,请使用whitespaceTokenizer或standardTokenizer,以及lowercasefilter。
感谢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>