Solr - 如何以复合 "word-1, word-1 + word-2, word-1 + word-2 ... word-n" 方式标记字符串中的单词?

Solr - How to tokenize words in a string in a compounding "word-1, word-1 + word-2, word-1 + word-2 ... word-n" manner?

我想标记一个字符串,例如 Best Beat Makers 以几乎类似于 NGram 的方式为每个单词生成标记,例如:

IN:  "Best Beat Makers"
OUT: ["Best", "Beat", "Makers", "Best Beat", "Best Beat Makers"]
                                     ^               ^
                                     |               |
                              How can I generate these tokens?

结果应该包括"Beat Makers",因为我只想以复合方式标记单词(例如 word1、word1 + word2、word1 + word2 + word3、等)而不是组合(例如 word1、word1 + word2、word2 + word3 等)。

目前,我只能使用StandardTokenizerFactoryClassicTokenizerFactory生成前三个标记,而传统的NGramTokenizerFactory仅适用于单词的字符(并且是索引有点贵)。

我考虑过的一个选项是使用 StandardTokenizerFactory 获取前三个标记,然后创建一个 copyField 到另一个字段,该字段使用 PatternTokenizerFactory 并定义正则表达式以获取最后两个标记,但如果可能的话,我更愿意只使用一个字段来获取我需要的标记。

如果您更熟悉 ElasticSearch,我仍然想听听您的想法,因为 Solr 和 ES 之间的分词器或多或少相似,可能会把我推向正确的方向。谢谢!

Shingle Filter : 该过滤器从令牌流中构造带状符号,它们是令牌 n-grams。它将令牌运行组合成一个令牌。

你也使用下面的属性。

maxShingleSize :(整数,必须 >= minShigleSize,默认为 2)每个 shingle 的最大令牌数。

这是应用的字段类型。

<fieldType name="text_tokens" class="solr.TextField" positionIncrementGap="100">
        <analyzer>
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true"/>
        </analyzer>
    </fieldType>

输入是:"Welcome to Apache Solr"

预期输出为:

Unigram: "Welcome", "to", "Apache", "Solr"
Bigram: "Welcome to", "to Apache", "Apache Solr"
Trigram: "Welcome to Apache", "to Apache Solr"

下面是您分享的文字分析。

输入是:Best Beat Makers