我们无法使用Solr搜索来搜索句子的某些部分。我们对以下结果尝试了不同的查询:
<doc>
<str name="id">7975</str>
<str name="name">Ici Paris XL geschenkset aanbieding</str>
<long name="_version_">1467524712314699776</long></doc>
</doc>
<doc>
<str name="id">7976</str>
<str name="name">De tuinen geschenkset aanbieding</str>
<long name="_version_">1467524712315748352</long></doc>
</doc>
我们尝试过的搜索:
*:*
返回所有内容*Paris*
仅返回第一个onen(对于巴黎,这是正确的)*Paris*XL*
仅返回第一个*paris*XL*
不返回任何内容(大写P现在为小写)*(Paris XL)*
返回所有内容*"Paris XL"*
返回所有内容(Paris XL)
不返回任何内容"Paris XL"
不返回任何内容我们想要的是能够搜索“ Paris XL”(带空格)并返回第一个结果。这样我们就可以搜索句子的一部分。那可能吗?如何?
最佳答案
您所缺少的是Lucene以及Solr如何执行其搜索的基本部分。 Solr不会搜索,但是会在为特定文档集创建的索引中查找搜索的标记(单词)。这样的索引-非常简化-就像每本书末尾的索引一样。您可以在那里查找每个单词在实际文本中的位置。
当前,因为使用fieldType字符串,所以您的字段名称根本没有标记。这意味着该字段的全部内容被索引为一个单词。正如您已经注意到的,这是一个问题。
现在搜索paris
时,Solr会查看索引并搜索令牌paris
是否存在于其中。但事实并非如此。以您发布的两个示例为例,您的索引包含两个条目Ici Paris XL geschenkset aanbieding
De tuinen geschenkset aanbieding
为了产生匹配,这些条目中的每一个都必须从前到后等于paris
。不是这种情况。因此,您用通配符*
包围了巴黎。这使Solr会查看索引的每个条目,这将导致非常非常非常差的性能。
那么,您应该如何解决呢?开始标记化! in the official documentation或the Solr Tutorial中对此进行了很好的描述。
最后,您将在您的schema.xml中添加一个自定义的fieldType,与此类似
<fieldType name="text_general" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
然后,您需要将字段名称的fielType更改为该新的fielType,然后需要重建索引。
然后,您的索引将包含更多字段名称条目,与上面的两个条目不同,但这些条目
ici
巴黎
l
格申克塞特
安比丁
德
吐嫩
然后,您可以查询
"paris xl"
。在搜索前后注意撇号。这使Solr可以执行短语查询,因此只有在paris
后跟xl
时,它才会产生匹配。