Solr搜索部分句子

时间:2014-05-08 10:10:19

标签: solr

我们在使用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”(带空格)并返回第一个结果。所以我们可以搜索部分句子。那可能吗?怎么样?

1 个答案:

答案 0 :(得分:4)

你缺少的是Lucene和Solr如何进行搜索的基本部分。 Solr不会搜索,但它会在为某组文档创建的索引中查找搜索的标记(单词)。这样的索引 - 非常简化 - 就像每本书末尾的索引一样。您可以在那里查找每个单词放在实际文本中的位置。

目前,您的字段名称根本没有标记,因为您使用fieldType 字符串。这意味着该字段的整个内容被索引为一个字。这是一个问题,正如您已经注意到的那样。

当您现在搜索paris时,Solr会查看索引并搜索其中是否存在令牌paris。但事实并非如此。以您发布的两个示例为例,您的索引包含两个条目

  1. Ici Paris XL geschenkset aanbieding
  2. De tuinen geschenkset aanbieding
  3. 这些条目中的每一个都需要相等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,并且您需要重建索引。

    然后你的索引将包含更多的字段名称条目,而不仅仅是上面的两个条目,而是这些条目

    1. ici
    2. 巴黎
    3. xl
    4. geschenkset
    5. aanbieding
    6. de
    7. tuinen
    8. 然后您可以查询"paris xl"。在搜索之前和之后记录叛逆者。这使得Solr执行短语查询,因此只有paris后面跟xl时才会产生匹配。