2016-11-30 92 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

    相關問題