2016-11-30 93 views
1

我得到了一个升级Solr的任务,hovewer从未与Solr合作过。 目前我有一个堆:Django的1.9.12 +奥斯卡1.3 + Solr的6.3.0 +草堆2.5.1将Solr 4.10升级到6.3后,搜索停止工作

我有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:没有显示(无结果) - >应该找到AMD a8-6500

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

如果我改变<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 - >应该找到刚才AMD a8-6500

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

我现在solrconfig.xmlmanaged-schema在GitHub上。

作为目前索引字段我用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. 

可以通过从managed-schema文件中删除

<defaultSearchField>text</defaultSearchField> 
    <solrQueryParser defaultOperator="AND"/> 

固定

更新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"

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

    回答

    1

    如果我想找到的Intel Pentium G3260或G3260奔腾还是INTEL G3260或G3260 - 没有结果。

    这与分析&标记化的字段有关。请参阅文档here

    使用ClassicTokenizerFactory进行令牌化的行为将如下所示: input:“Please,请将电子邮件[email protected]发送至03-09,重新:m37-xq。” 输出:“Please”,“email”,“[email protected]”,“by”,“03-09”,“re”,“m37-xq”

    使用solr.EdgeNGramTokenizerFactory进行标记这样的表现: 输入:“babaloo” 输出:“BA”,“巴布”,“巴巴”,“babal”

    schema.xml中,你可以定义一个新的字段类型,或更新现有的一个像所以:

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

    玩耍一下,看看哪一个适合你的场景。你可能也想看看你给出的查询是如何规范化的。但这是一个很好的开始。

    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 
    
    +0

    我明白这一点,但如何解决\删除此页面的警告:http:// localhost:8983/solr /#/〜logging? – TitanFighter

    相关问题