【发布时间】:2016-11-30 22:22:54
【问题描述】:
我有一个升级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:Nothing to show (no results) -> 应该可以找到 AMD a8-6500Search string:AMD;Result:显示所有 AMD 产品 -> 符合预期
如果我将<str name="q.op">AND</str> 更改为<str name="q.op">OR</str>:
Search string:AMD a8-6500;Result:AMD A8-6500 显示所有 AMD 和 A8-6500 -> 应该只找到 AMD a8-6500Search string:a8-6500;Result:AMD A8-6500 (AD650BOKA44HL) 和 INTEL Core™ i5 6500 -> 应该只找到 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')
如何修复\标准化搜索?
更新 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: 根据苏格拉底的回答,这是最终的变化:
-
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>
由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>
- 在
sorlconfig.xml代码中:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
</lst>
</requestHandler>
改为:
<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>
【问题讨论】:
标签: django solr django-haystack django-oscar