将Solr 4.10升级到6.3后,搜索停止了工作

时间:2016-11-30 22:22:55

标签: django solr django-haystack django-oscar

我有一个升级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>

之后,搜索部分开始起作用。

几个例子:

  1. INTEL Pentium G3260 (CM8064601482506)项,搜索仅适用于INTEL PentiumCM8064601482506。如果我想查找INTEL Pentium G3260Pentium G3260INTEL G3260G3260,则无法找到结果。

  2. Search string: AMD a8-6500; Result:无法显示(无结果) - &gt;应该找到AMD a8-6500

  3. Search string: AMD; Result:显示所有AMD产品 - &gt;正如预期的那样

  4. 如果我将<str name="q.op">AND</str>更改为<str name="q.op">OR</str>

    1. Search string: AMD a8-6500; Result: AMD A8-6500显示所有AMD和 A8-6500 - &gt;应该只找到AMD a8-6500

    2. Search string: a8-6500; Result: AMD A8-6500(AD650BOKA44HL)和 INTEL Core™i5 6500 - &gt;应该只找到AMD a8-6500

    3. 我目前在GitHub上的solrconfig.xmlmanaged-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,&#8203; please use 'df' on request instead.
      [default] query parser default operator is AND. WARNING: Deprecated,&#8203; please use 'q.op' on request instead.
      

      可以通过删除

      来修复
        <defaultSearchField>text</defaultSearchField>
        <solrQueryParser defaultOperator="AND"/>
      

      来自managed-schema档案

      更新2: 根据Socratees的回答,这是最后的修改:

      1. 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

      2. 由于我在indexes.CharField managed-schema中有其他字段,因此我发现这些字段使用的是text_en类型,并替换为fieldType name="text_en"

      3. &#13;
        &#13;
        <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;
        &#13;
        &#13;

        haystack生成的

        &#13;
        &#13;
        <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;
        &#13;
        &#13;

        1. sorlconfig.xml代码:
        2. &#13;
          &#13;
          <requestHandler name="/select" class="solr.SearchHandler">
            <lst name="defaults">
              <str name="echoParams">explicit</str>
              <int name="rows">10</int>
            </lst>
          </requestHandler>
          &#13;
          &#13;
          &#13;

          更改为:

          &#13;
          &#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;
          &#13;
          &#13;

2 个答案:

答案 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