如何使用Solr进行通配符和模糊搜索?

3
我在使用Solr来搜索我的数据,但我发现一些Solr搜索查询语言功能对我不起作用。我需要以下这些功能:
  • 模糊搜索
  • 通配符*? - 我还没有设置分词,这将有助于暂时进行搜索
  • 字段规范化 - 目前我无法告诉它在标题中搜索:Blabla
据我所知,这些功能应该是Solr默认支持的,但我明显没有它们。我使用的是Solr 1.4版本。您可以在此处找到我的架构。谢谢您的帮助。
2个回答

5
我在谷歌上搜索了“solr模糊搜索”,发现您在这里提出了相关问题。实际上,SOLR 4.0版本可以使用简单的查询语法进行模糊搜索。
例如,您可以搜索name:peter来严格搜索,或者使用波浪号符号name:peter~进行模糊搜索。如果您想稍微限制模糊性,可以添加一个百分比,例如name:peter~0.7...这意味着您想要搜索70%“清晰度”的peter。

2
“Sharpness”这个术语的真正含义是相似性 - MECU

4

您的fieldType name="text"缺少很多过滤器。参考一下默认的schema.xml中的文本fieldType:

<!-- A text field that uses WordDelimiterFilter to enable splitting and matching of
    words on case-change, alpha numeric boundaries, and non-alphanumeric chars,
    so that a query of "wifi" or "wi fi" could match a document containing "Wi-Fi".
    Synonyms and stopwords are customized by external files, and stemming is enabled.
    -->
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <!-- Case insensitive stop word removal.
      add enablePositionIncrements=true in both the index and query
      analyzers to leave a 'gap' for more accurate phrase queries.
    -->
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
  </analyzer>
</fieldType>

例如,SnowballPorterFilterFactory 是使词干提取变得可能的工厂。
我建议基于默认的schema.xml构建您的模式,在必要时进行微调和修改(而不是从头开始)。 这里是分析器、标记器和过滤器的参考资料

谢谢Mauricio。我使用lettertokenizer代替whitespacetokenizer。Whitespacetokenizer会忘记单词末尾的标点符号。你列出的其他所有东西都没问题,我会使用它们,但我更喜欢从一个简化的集合开始。例如,我现在不能使用snowball stemmer,因为它还没有适用于我的语言。查询解析与SolrQueryParser有关吗?http://lucene.apache.org/solr/api/org/apache/solr/search/SolrQueryParser.html是吗? - fifigyuri
看起来匈牙利词干可以购买:http://www.lucidimagination.com/search/document/CDRG_ch05_5.6.16。另外,你为什么问SolrQueryParser?你想扩展Solr吗?通常情况下,你不需要更改Solr中的代码,因为它高度可扩展和可配置。 - Mauricio Scheffer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接