Search Solr-如何在复合词中标记字符串中的单词;word-1,word-1+;word-2、word-1和#x2B;word-2。。。word-n";态度?

Search Solr-如何在复合词中标记字符串中的单词;word-1,word-1+;word-2、word-1和#x2B;word-2。。。word-n";态度?,search,solr,tokenize,Search,Solr,Tokenize,我想标记一个字符串,例如最佳拍子制作者,以类似于NGram的方式为每个单词生成标记,例如: IN: "Best Beat Makers" OUT: ["Best", "Beat", "Makers", "Best Beat", "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等)

目前,我只能使用
StandardTokenizerFactory
ClassicTokenizerFactory
生成前三个令牌,而传统的
NGramTokenizerFactory
仅适用于单词的字符(在索引上有点贵)

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


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

木瓦过滤器
: 此过滤器从令牌流中构造标识n-gram的带状图。它将令牌的运行组合到单个令牌中

您也可以使用下面的属性

maxShingleSize:
(整数,必须>=minShingleSize,默认值2)每个木瓦的最大令牌数

下面是应用的字段类型

<fieldType name="text_tokens" class="solr.TextField" positionIncrementGap="100">
        <analyzer>
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true"/>
        </analyzer>
    </fieldType>
下面是对您共享的文本的分析

输入为:
Best Beat maker


感谢您的帮助,我最终实现了这种方法,效果非常好!
Unigram: "Welcome", "to", "Apache", "Solr"
Bigram: "Welcome to", "to Apache", "Apache Solr"
Trigram: "Welcome to Apache", "to Apache Solr"