2014-05-08 186 views
3

我們無法使用Solr搜索來搜索句子的部分。我們嘗試下面的結果不同的查詢:Solr搜索部分句子

<doc> 
    <str name="id">7975</str> 
    <str name="name">Ici Paris XL geschenkset aanbieding</str> 
    <long name="_version_">1467524712314699776</long></doc> 
</doc> 
<doc> 
    <str name="id">7976</str> 
    <str name="name">De tuinen geschenkset aanbieding</str> 
    <long name="_version_">1467524712315748352</long></doc> 
</doc> 

搜索我們嘗試:

  • *:*返回一切
  • *Paris*回報只是第一個onen(巴黎,這是正確的)
  • *Paris*XL*只返回第一個
  • *paris*XL*什麼也沒有返回(大寫P現在小寫)
  • *(Paris XL)*回報一切
  • *"Paris XL"*返回一切
  • (Paris XL)返回任何
  • "Paris XL"返回任何

我們需要的是能夠搜索「巴黎XL」(用空格)和返回第一個結果。所以我們可以搜索部分句子。那可能嗎?如何?

+0

這不是你如何搜索的問題,而是你如何準備搜索索引。這意味着你必須調整你的自定義[分析器](http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters )或者爲'name'字段使用不同的名稱。所有在schema.xml中找到的。所以,如果你需要幫助,請從你的schema.xml發佈什麼fieldType用於'name'以及那裏的fieldType是如何聲明的。 – cheffe

+0

@cheffe,謝謝你的回覆。我看了一下schema.xml,'name'的fieldType只是一個'string'。 –

回答

4

你缺少的是Lucene和Solr如何執行其搜索的基本部分。 Solr不搜索,但它查找索引中已經爲特定文檔集創建的搜索詞(單詞)。這樣的指數非常簡單 - 就像每本書末尾的指數一樣。您可以在那裏查看每個單詞放在實際文本中的位置。

目前所在領域沒有標記化可言,因爲你使用字段類型。這意味着該字段的全部內容被索引爲一個字。這是一個問題,正如你已經注意到的那樣。

當您現在搜索paris時,Solr會查看索引並搜索標記paris是否存在。但事實並非如此。以您已發佈了兩個例子,你的指數包括兩個條目

  1. Ici Paris XL geschenkset aanbieding
  2. De tuinen geschenkset aanbieding

每個這些條目的需要是等於paris - 從前端至年底 - 爲了產生一擊。不是這種情況。所以你用通配符*包圍了巴黎。這使Solr能夠查看索引的每個條目,這會導致非常非常糟糕的性能。


那麼你應該怎麼做才能解決這個問題?開始標記化!這被描述得相當好in the official documentationthe Solr Tutorial


最終你會在你的架構添加自定義的字段類型。XML,類似這樣的

<fieldType name="text_general" class="solr.TextField"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

然後,你將需要改變你的領域的fielType到新fielType和您需要重建索引。

那麼你的索引將包含多個條目的字段名稱,而不是像上面只有兩個,但這些的

  1. ICI
  2. 巴黎
  3. XL
  4. geschenkset
  5. aanbieding
  6. de
  7. tuinen

然後您可以查詢"paris xl"。在搜索之前和之後在apostrophs記錄。這使Solr執行一個詞組查詢,所以只有在paris後面跟着xl纔會產生一個命中。

+0

太棒了,我會試試!我會讓你知道或者是否有用。謝謝! –

+0

它的工作原理!謝謝。 –