2010-02-03 50 views
0

我有草垛/ Solr中的一個簡單的配置對我Django應用程序:的Django /草堆/ Solr的簡單配置 - 部分場匹配問題

從這個應用程序的models.py:

class device(models.Model): 
    ... 
    hostname = models.CharField(max_length=45, help_text="The hostname for this device") 
    ... 

從這個應用程序的search_sites.py:

class devIndex(indexes.SearchIndex): 
    '''Haystack class to allow for indexing device objects in TOMS''' 
    text = indexes.CharField(document=True, use_template=True) 

從模板/搜索/索引/ systems_management/device_text.txt FO這個應用程序(名都嘲弄)

... 
{{ object.hostname }} 
... 

問題:

的系統被命名爲static1.foo.com:

如果我搜索「靜」,我得到了所有靜態服務器結果(「靜態」在他們的描述字段)

如果我搜索「static1」,我得到0的結果

如果我搜索「static1.foo.com」我得到的結果,包括該服務器。

我的問題是,爲什麼haystack/solr不匹配「static1」查詢?

回答

0

這可能是一個分析問題。我猜你在schema.xml文件中使用了StandardTokenizer來處理這個字段。

標準標記器將主機名標記爲單個標記。 (編號:http://www.lucidimagination.com/search/document/CDRG_ch05_5.5.1),所以您只能將其與完整的主機名匹配。

如果您想逐件搜索,則需要使用不同的標記器。 Solr示例中的默認文本字段使用WhitespaceTokenizer和WordDelimeter篩選器,該篩選器將拆分主機名。這將允許您通過查詢'static1'來查找。

+0

感謝您的意見。我看到在config.xml中schema.xml中詳細說明了這些內容。 我編輯我的schema.xml中讀取如下: <字段名=「主機名」類型=「文本」索引=「真」存儲=「真」的多值=「真」 /> 然後我重建索引,但我仍然沒有得到任何結果對部分主機名搜索: ... <海峽NAME = 「q」> static1 ... <結果名稱= 「響應」 numFound =」 0「start =」0「/> 我找不出什麼(別的)我錯過了。 – jduncan 2010-02-08 18:57:22

0

Solr有許多可能的配置。對於您的用例,您可能需要在schema.xml中使用邊緣ngram。這裏是一個例子:

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15" side="front" /> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/> 
    </analyzer> 

使用此示例,並稍微調整它,直到它返回所需的結果。