在Solr中使用多个标记器

Mat*_*ell 10 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>
Run Code Online (Sandbox Code Playgroud)

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

<fieldType name="text" class="solr.TextField" >
  <analyzer type="index">
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
...
</fieldType>
Run Code Online (Sandbox Code Playgroud)

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

Mau*_*fer 10

声明具有NGram标记化器的另一个fieldType(即不同的名称),然后声明使用带有NGram的fieldType的字段和具有标准"text"fieldType的另一个字段.使用copyField将一个复制到另一个.请参阅在多个字段中索引相同数据.


小智 8

另一种方法是EdgeGramFilterFactory将现有字段应用到现有字段并保留当前的tokenizer(WhitespaceTokenizerFactory),例如

<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" />
Run Code Online (Sandbox Code Playgroud)

这将保持您当前的架构不变,即您不需要另外一个具有另一个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>
Run Code Online (Sandbox Code Playgroud)