Solr难以通过多个术语进行模糊搜索

时间:2014-07-08 23:04:37

标签: solr sunspot

假设某人的名字是Alessia Keeling。我无法获得以下查询工作

q=Alessia Keeling会返回结果

q=Alessia会返回结果

q=Alessia Keel会返回结果

然而,

q=Alessia Keeliq=Alessia Keelin不会返回结果

我在schema.xml文件中尝试过很多东西,但是我的MADNESS没有多少方法。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ReversedWildcardFilterFactory"/>
  </analyzer>
   <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="20" side="front"/>
  </analyzer>
</fieldType>

Solr Admin Analyzer显示它将匹配&#34; Alessia&#34;和各种形式的&#34;基林&#34;,但是太阳黑子仍然没有返回结果。

修改1

这是控制台测试

(byebug) Sunspot.commit 
(byebug) Sunspot.index
(byebug) User.search {|q| q.fulltext "Alessia Keeling" }.hits 
[#<Sunspot::Search::Hit:User 4>]  
(byebug) User.search {|q| q.fulltext "Alessia Keelin" }.hits 
[]

编辑2 我终于能够到达某个地方了。我查看了一些日志文件,发现我的应用程序调用solr的调用是使用查询字符串

"http://localhost:8981/solr/select?fq=type%3AUser&q=Eli+Donnelly+I&fl=%2A+score&qf=email+first_name_text+last_name_text+username_text+name_text+description_text&defType=dismax&start=0&rows=30&debugQuery=true

这打印出一些有用的信息,最有用的是&#34; parsedQuery&#34;我能够看到另一个领域是冲突的。我有另一个处理电子邮件的字段,在后一种情况下,我的查询字符串是&#34; Eli Donnely I&#34;,唯一的字母标记&#34;我&#34;由于电子邮件字段,我打破了查询。添加长度过滤器修复它。

3 个答案:

答案 0 :(得分:0)

如评论中所述,您需要将EdgeNGramFilterFactory切换为索引而不是查询。

答案 1 :(得分:0)

我已经从Solr端尝试了这个示例内核,并在索引时使用NGram过滤器返回匹配。您可能希望检查服务器端日志,以确定您至少要重新编制索引。

字段定义如下:

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ReversedWildcardFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="20" side="front"/>
  </analyzer>
   <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

data.json:

[{"id": 1, "text": "Alessia Keeling"}, {"id": 2, "text": "Alessia Fubar"}]

用数据填充:

curl http://localhost:8983/solr/collection1/update\?commit\=true --data-binary @data.json -H 'Content-type:application/json'

搜索:

GET http://localhost:8983/solr/collection1/select\?q\=alessia%20keelin\&q.op\=AND 
[..]
<result name="response" numFound="1" start="0"><doc><int name="id">1</int><str name="text">Alessia Keeling</str><long name="_version_">1473248002863792128</long></doc>  </result>

..返回承诺的文档,同时保持不匹配的文档不在结果中。

答案 2 :(得分:0)

对我而言,这显然有效。编辑文件schema.xml,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<schema name="sunspot" version="1.0">
... (other stuff)
<solrQueryParser defaultOperator="AND|OR"/>
... (other stuff)
</schema>

之前,我将defaultOperator配置为 AND ,在我更改之后,搜索变得更加灵活。

另外,我建议您查看this page