我们无法使用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 documentationthe 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时,它才会产生匹配。

10-04 14:57