我有一个升级Solr
的任务,之前从未与Solr
合作过。
目前我有下一个堆栈:Django 1.9.12 + Oscar 1.3 + Solr 6.3.0 + Haystack 2.5.1
我有Haystack
生成的架构,将其放在managed-schema
文件中并根据StackOverflow的答案进行了一些修改,因为Solr
不想启动。
现在我有Solr启动,但无法通过网站的搜索字段找到任何内容(使用Solr 4.10,搜索按预期工作没有任何问题)。
在以下部分的solrconfig.xml
中:
<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
</lst>
我试图添加:
<str name="df">text</str>
<str name="q.op">AND</str>
之后,搜索部分开始起作用。
几个例子:
有INTEL Pentium G3260 (CM8064601482506)
项,搜索仅适用于INTEL Pentium
或CM8064601482506
。如果我想查找INTEL Pentium G3260
或Pentium G3260
或INTEL G3260
或G3260
,则无法找到结果。
Search string:
AMD a8-6500;
Result:
无法显示(无结果) - &gt;应该找到AMD a8-6500
Search string:
AMD;
Result:
显示所有AMD产品 - &gt;正如预期的那样
如果我将<str name="q.op">AND</str>
更改为<str name="q.op">OR</str>
:
Search string:
AMD a8-6500; Result:
AMD A8-6500显示所有AMD和
A8-6500 - &gt;应该只找到AMD a8-6500
Search string:
a8-6500; Result:
AMD A8-6500(AD650BOKA44HL)和
INTEL Core™i5 6500 - &gt;应该只找到AMD a8-6500
我目前在GitHub上的solrconfig.xml和managed-schema。
作为索引字段,我现在使用EdgeNgramField
,即:
from haystack import indexes
class ProductIndexes(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(
document=True, use_template=True,
template_name='search/indexes/cpu/item_text.txt')
如何修复\ normalize search?
更新1: 仪表板记录页面上的警告
[default] default search field in schema is text. WARNING: Deprecated,​ please use 'df' on request instead.
[default] query parser default operator is AND. WARNING: Deprecated,​ please use 'q.op' on request instead.
可以通过删除
来修复 <defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
来自managed-schema
档案
更新2: 根据Socratees的回答,这是最后的修改:
indexes.EdgeNgramField
在下一个代码中:
class ProductIndexes(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(
document=True, use_template=True,
template_name='search/indexes/cpu/item_text.txt')
更改为indexes.CharField
。
由于我在indexes.CharField
managed-schema
中有其他字段,因此我发现这些字段使用的是text_en
类型,并替换为fieldType name="text_en"
:
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<!-- 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.
-->
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="lang/stopwords_en.txt"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
<filter class="solr.EnglishMinimalStemFilterFactory"/>
-->
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="lang/stopwords_en.txt"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
<filter class="solr.EnglishMinimalStemFilterFactory"/>
-->
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
&#13;
由
haystack
生成的:
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
&#13;
sorlconfig.xml
代码:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
</lst>
</requestHandler>
&#13;
更改为:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">text</str>
<str name="q.op">AND</str>
</lst>
</requestHandler>
&#13;
答案 0 :(得分:1)
如果我想找到INTEL Pentium G3260或Pentium G3260或INTEL G3260或G3260 - 没有结果。
这与如何分析现场和符号化。请参阅文档here。
使用ClassicTokenizerFactory进行标记将表现如下: 输入:&#34;请在03-09之前发送电子邮件至john.doe@foo.com,电话:m37-xq。&#34; 输出:&#34;请&#34;,&#34;电子邮件&#34;,&#34; john.doe@foo.com",&#34; by&#34;,&#34; 03- 09&#34;,&#34; re&#34;,&#34; m37-xq&#34;
使用solr.EdgeNGramTokenizerFactory进行标记将表现如下: 输入:&#34; babaloo&#34; 输出:&#34; ba&#34;,&#34; bab&#34;,&#34; baba&#34;,&#34; babal&#34;
在schema.xml中,您可以定义新的字段类型,或更新现有字段类型:
<fieldType name="text" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
</analyzer>
</fieldType>
四处游走,看看哪一个适合你的场景。您可能还想查看您提供的查询是如何规范化的。但这是一个很好的起点。
答案 1 :(得分:0)
在solr请求中使用q.op时。 “q.op”请求参数优先于此。
<solrQueryParser defaultOperator="OR"/>
q.op参数的示例查询:
http://localhost:8983/solr/collection1/select?indent=on&q.op=AND&q=for ipod&wt=json