2012-03-23 63 views
0

我想寫一個特定的字段類型,其工作方式如下面的示例所示:
假設我們有一個名稱:foo MooBar (f00B2r);
Solr searchField模式的單個匹配

  • 「F」=>foo MooBar (f00B2r)(和其他人用 「F」)
  • 「富moob」=>foo MooBar (f00B2r)(和其他與 「富moob」 等)
  • 「富(F0" =>foo MooBar (f00B2r)
  • 「moobar F」=>foo MooBar (f00B2r)
  • 「(f00b2r)」=>foo MooBar (f00B2r)
  • 「酒吧」=>無
  • 「moobar○」=>無
  • 「moob富」=>無

我的問題:

  1. 如果我搜索 「moobar F」 我會得到無;
  2. 如果我搜索「(f00b2r)」,我將無法獲得;

我的字段類型Solr中/ conf目錄/ schema.xml中:

<fieldType name="frontMatch" class="solr.TextField" positionIncrementGap="255"> 
    <analyzer type="index"> 
    <tokenizer class="solr.LowerCaseTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="255" side="front" /> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="255" side="front" /> 
    </analyzer> 
</fieldType> 

附:
對不起,我的英文和謝謝;

+0

我不知道第一個問題,但就第二個問題而言 - 您是否嘗試過轉義括號?例如,查詢'(foob2r \)'而不是'(foob2r)'? – 2012-03-25 02:28:42

回答

0

對我來說,解決辦法:
部分scheme.xml

<fieldType name="frontMatch" class="solr.TextField" positionIncrementGap="0" > 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="255" side="front" /> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="255" side="front" /> 
    </analyzer> 
</fieldType> 

這解決了第二問題。
要解決第一個問題 one:
每個查詢都應該用Proximity完成;
數字1000000在搜索時等於運算符「AND」。
因此,搜索查詢看起來像:name:"moobar f"~1000000;
其中name是我們正在搜索的字段;