【问题标题】:Solr not searching for words ending in "e"Solr不搜索以“e”结尾的单词
【发布时间】:2014-08-28 15:18:32
【问题描述】:

我是 Solr 的新手,遇到了一个奇怪的问题。

当我搜索以“e”结尾的单词时,它总是不返回任何结果。例如:

假设数据库中有一条记录“QWERTY”。 当搜索词为“QWERT”时,返回记录“QWERTY”。 当搜索词为“QWERTY”时,返回记录“QWERTY”。 (正确)

假设数据库中有一条记录“ABCDE”。 当搜索词为“ABCD”时,返回记录“ABCDE”。 当搜索词为“ABCDE”时,什么都不返回!!

我发现了一些与“solr ignores last letter”相关的问题和一些类似的东西,但没有找到与此相关的东西。

我正在使用 Solr 0.9.2.2(3 年项目)、Rails 3.2.2、Apache 2.2.22 和 Ubuntu 12.04 LTS

有什么想法吗??

谢谢!

--编辑-- 架构: http://www.speedyshare.com/khdcr/schema.xml

查询: query_string = ("%" + params[:nome] + "%").upcase produto_busca = Estoque::Produto.of(current_empresa).where("nome LIKE ? or est_produtos.nome_fantasia LIKE ?", query_string, query_string).order("nome ASC")

有几个查询有相同的问题。这只是一个例子。

【问题讨论】:

  • 需要 Solr schema.xml 和您正在使用的查询
  • 我已经使用查询和架构编辑了帖子。

标签: ruby-on-rails apache solr


【解决方案1】:

几周后,我找到了解决这个问题的方法。

Lucene Solr 有一个名为 Stemming 的过滤器。这个过滤器基本上捕获了单词的“根”。它会删除一些字母来做到这一点,例如:

关于我的系统的要点是:

  • 语言:葡萄牙语
  • 不索引全文,只索引一些单词。

解决方案是从 Solr Schema (solr/conf/schema.xml) 中删除 Stemming:

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type='index'>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.ASCIIFoldingFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.ASCIIFoldingFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

新代码基本上用“空格”分隔单词,将特殊字符更改为常规字符(á -> a),将所有字母小写(Aaa -> aaa)并使用NGram过滤器(abc -> ab bc abc ...)。

(参考:https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions

希望这会有所帮助...

Ps:Stemming 有多种语言的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多