我们在使用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”(带空格)并返回第一个结果。所以我们可以搜索部分句子。那可能吗?怎么样?
答案 0 :(得分:4)
你缺少的是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,并且您需要重建索引。
然后你的索引将包含更多的字段名称条目,而不仅仅是上面的两个条目,而是这些条目
然后您可以查询"paris xl"
。在搜索之前和之后记录叛逆者。这使得Solr执行短语查询,因此只有paris
后面跟xl
时才会产生匹配。