【问题标题】:After upgrading Solr 4.10 to 6.3 the search stopped working将 Solr 4.10 升级到 6.3 后,搜索停止工作
【发布时间】: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>

之后搜索部分开始工作。

几个例子:

  1. INTEL Pentium G3260 (CM8064601482506)这样的项目,搜索只适用于INTEL PentiumCM8064601482506。如果我想找到 INTEL Pentium G3260Pentium G3260INTEL G3260G3260 - 没有结果。

  2. Search string: AMD a8-6500; Result:Nothing to show (no results) -> 应该可以找到 AMD a8-6500

  3. Search string: AMD; Result: 显示所有 AMD 产品 -> 符合预期

如果我将&lt;str name="q.op"&gt;AND&lt;/str&gt; 更改为&lt;str name="q.op"&gt;OR&lt;/str&gt;

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

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

我目前在 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')

如何修复\标准化搜索?


更新 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: 根据苏格拉底的回答,这是最终的变化:

  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" 替换为:

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


    【解决方案1】:

    如果我想找到 INTEL Pentium G3260 或 Pentium G3260 或 INTEL G3260 或 G3260 - 没有结果。

    这与字段的分析和标记方式有关。请参阅文档here

    使用 ClassicTokenizerFactory 进行标记化的行为如下: 输入:“请在 03-09 之前发送电子邮件至 john.doe@foo.com,回复:m37-xq。” 输出:“请”、“电子邮件”、“john.doe@foo.com”、“by”、“03-09”、“re”、“m37-xq”

    使用 solr.EdgeNGramTokenizerFactory 进行标记化的行为如下: 输入:“巴巴鲁” 输出:“ba”、“bab”、“baba”、“babal”

    在 schema.xml 中,您可以定义一个新的字段类型,或者像这样更新现有的:

    <fieldType name="text" class="solr.TextField">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
      </analyzer>
    </fieldType>
    

    玩一玩,看看哪一个适合你的场景。您可能还想查看您给出的查询是如何标准化的。但这是一个很好的起点。

    【讨论】:

      【解决方案2】:

      当您在 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
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      相关资源
      最近更新 更多