2012-03-23 67 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是我们正在搜索的字段;