在Solr中使用多个标记器

时间:2010-08-05 03:07:35

标签: solr tokenize

我希望能够做的是执行查询并获得不区分大小写且与索引中的部分单词匹配的结果。

我已经修改了Solr架构,这样我就可以查询并返回结果,无论它们是什么情况。所以,如果我搜索iPOd,我会看到iPod返回。执行此操作的代码是:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
  </analyzer>
...
</fieldType>

我发现这段代码可以让我们进行部分单词匹配查询,但我认为我不能在一个字段上有两个标记符。

<fieldType name="text" class="solr.TextField" >
  <analyzer type="index">
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
...
</fieldType>

那么我该怎样做才能在场上执行这个标记器呢? 或者有没有办法合并它们? 或者还有另一种方法可以完成这项任务吗?

2 个答案:

答案 0 :(得分:10)

声明具有NGram标记化器的另一个fieldType(即不同的名称),然后声明使用带有NGram的fieldType的字段和具有标准“text”fieldType的另一个字段。使用copyField将一个复制到另一个。请参阅Indexing same data in multiple fields

答案 1 :(得分:8)

另一种方法是将EdgeGramFilterFactory应用于现有字段并保留当前的标记化程序(WhitespaceTokenizerFactory),例如

<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" />

这将保持您当前的架构不变,即您不需要另外一个具有另一个tokenizer(NGramTokenizerFactory

的字段

您的字段看起来如下所示:

   <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" />
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
  </analyzer>
...
</fieldType>