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"