假设某人的名字是Alessia Keeling。我无法获得以下查询工作
q=Alessia Keeling
会返回结果
q=Alessia
会返回结果
q=Alessia Keel
会返回结果
然而,
q=Alessia Keeli
和q=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;由于电子邮件字段,我打破了查询。添加长度过滤器修复它。
答案 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。