代码之家  ›  专栏  ›  技术社区  ›  Matt Dell

在Solr中使用多标记化器

  •  10
  • Matt Dell  · 技术社区  · 16 年前

    我想要能够做的是执行一个查询,并返回不区分大小写和匹配索引中部分单词的结果。

    我现在已经建立了一个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 回复  |  直到 7 年前
        1
  •  10
  •   Mauricio Scheffer    16 年前

    声明另一个具有ngram标记器的fieldtype(即其他名称),然后声明一个将fieldtype与ngram一起使用的字段,以及另一个具有标准“文本”fieldtype的字段。使用copyfield将一个复制到另一个。见 Indexing same data in multiple fields .

        2
  •  8
  •   7ochem    7 年前

    另一种选择是应用 EdgeGramFilterFactory 到现有的领域,并与您当前的标记器( WhitespaceTokenizerFactory ),例如

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

    这将保持您当前的模式不变,即您不需要具有另一个标记器的附加字段。( 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>