Solr之拼音检索。

        拼音检索中国人的专用检索,例如:中文内容为“中国”的输入 “zhongguo”、“zg”、“zhonggu 全拼”、“简拼”、“拼音”的相邻的一部分都应该能检索出“中国”来。

        想要实现拼音检索第一个就是拼音转换,我这里用的是pinyin4j进行拼音转换。第二个就是N-Gram的题目,推敲到用户可能输入的既不是前缀也不是后缀,所以此处选择的是N-Gram,Solr里的实现叫 EdgeNGramTokenFilter,但是分的太细了,不需要这么复杂 EdgeNGramTokenFilter,也就是说我们用的N-Gram不同于传统的N-Gram。

        同样的例子使用EdgeNGramTokenFilter从前往后取2-Gram的结果是zh,一般是取min - max 之间的所有 gram,所以使用EdgeNGramTokenFilter取2-20的gram结果就是zh,zho,zhon,zhong,zhongg,zhonggu,zhongguo,从这个例子也不难理解为什么我要选择使用EdgeNGramTokenFilter而非一般意义上的N-Gram,考虑到用户可能输入的不是前缀而是后缀,所以为了照顾这些用户,我选择了从前往后和从后往前使用了两次 EdgeNGramTokenFilter,这样不只是前缀、后缀,二十任意的字串都考虑进去了,所以大幅度的提高了搜索体验。

        现在思路明确了我们把它结合到Solr中,为了方便使用现在写了两个Filter进行处理拼音分词问题一个是拼音转换Filter(Pinyin TransformTokenFilter)一个是拼音N-Gram的Filter(PinyinNGramTokenFilter),这样一来使用时就不用再添加索引前做拦音的转换了。而且Pinyin Transform TokenFilter 还有个好处就是它只使用中文分词器分过的词,也就是说做转换的词都是有用的不重复的,不会对没用的停词类的做拼音转换和重复拼音转换,这样大大的提高了拼音转换速度。

        想要Solr支持拼音检索就要先把拼音分词(PinyinAnalyzer)的jar复制到\solr\contrib\analysis-extras\lib下,然后在schema.xml中配置一个拼音字段类型:

<fieldType name = "text_pinyin" class = "solr.TextField" positionIncrementGrap = "0">

<analyzer type = "index">

<tokenizer class = "org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory" />

<filter class = "org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory" />

<filter class = "com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLength = "2" />

<filter class = "com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram = "1" maxGram = "20" />

</analyzer>

<analyzer type = "query">

<tokenizer class = "org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory" />

<filter class = "org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory" />

<filter class = "com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLength = "2" />

<filter class = "com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram = "1" maxGram = "20" />

</analyzer>

</fieldType>

         minTermLength:最小中文词长度,意思是小于这个值的中文词不会做拼音转换。

         minGram:最小拼音切分长度。

         如果想使用简拼的话在拼音转换Filter使用这个参数isFirstChar="true"就可以了。

         在这个拼音类型中我们使用了smartcn的中言语分词器,如果想使用其他的自己换掉就行了。现在我们在原来索引中加入一个拼音字段,因为只做索引,我们可以这样配置:

<field name = "pinyin" type = "text_pinyin" indexed = "true" stored = "false" multiValued = "false" />

         加完后我们重新启动Solr测试一下看看。

         由于上面minTermLenght和minGram设置的值,现在出现了人没有进行拼音转换并且最小拼音切分是从1个开始的。

         到这里我们的配置还有没完成,还要加几个copyFiled,这样就不用单独处理我们新加的拼音字段。

<copyField source = "context" dest = "pinyin" />

<copyField source = "text" dest = "spell" />

到现在就可以使用拼音检索了。

拼音分词器jar要复制到项目内。

在Linux系统中,配置网络和查看网络状态是系统管理员和用户经常需要进行的操作。为了更好地帮助你理解和掌握这些操作,我建议你查阅《Linux操作系统入门:系统配置与常用命令详解》这本书籍。它详细解释了如何使用命令行来管理Linux系统,包括网络配置和状态检查等。 参考资源链接:[Linux操作系统入门:系统配置与常用命令详解](https://wenku.csdn.net/doc/64af4b158799832548ed6d5f?spm=1055.2569.3001.10343) 首先,配置网络通常涉及修改网络接口的设置,这可以通过`ifconfig`或`ip`命令来实现。例如,使用`ifconfig eth0 ***.***.*.** netmask ***.***.***.* up`命令可以配置名为`eth0`的接口,将其IP地址设置为`***.***.*.**`并启用该接口。而在较新的Linux发行版中,推荐使用`ip`命令,如`ip addr add ***.***.*.**/24 dev eth0`。 其次,查看当前的网络状态可以使用多种命令,比如`ifconfig`或`ip addr show`来列出所有网络接口的状态。此外,`ping`命令用于测试网络连接的可达性,而`traceroute`或`tracepath`用于追踪数据包到达目的地的路径。 网络配置文件位于`/etc/network/interfaces`或使用较新的网络管理器时,配置文件可能位于`/etc/NetworkManager/system-connections/`目录下。通过编辑这些文件,可以永久性地更改网络设置。 当需要查看网络接口的统计信息时,可以使用`netstat`或`ss`命令。`netstat -tulnp`可以显示TCP和UDP协议的监听端口,而`ss -tulnp`是一个性能更好的替代品。 如果你想查看路由表,可以使用`route`或`ip route`命令。这些命令将显示当前的路由规则以及数据包的转发路径。 为了更好地理解和掌握Linux网络的配置和状态检查,除了阅读《Linux操作系统入门:系统配置与常用命令详解》,还应该在实际环境中进行实践操作,这样才能更快速地熟悉这些命令和操作。 参考资源链接:[Linux操作系统入门:系统配置与常用命令详解](https://wenku.csdn.net/doc/64af4b158799832548ed6d5f?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值