Solr 数字字符不能搜索的一个问题
问题一: 测试人员告诉我数字不能被搜索。于是开始找原因:
<fields>
***
<field name="productName" type="text" indexed="true" stored="true" />
***
</fields>
fieldType text配置:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="front"/>
</analyzer>
</fieldType>
当我的productName中包含数字字符的时。比如有个产品的名字叫 ‘嘎嘎噶123’ 那么用数字1/2/3/12等等都不能搜索到
当时‘123嘎嘎噶’时也是一样。找了好久没有找到原因。也不知道怎么去找这个原因。于是边问喷油。猜想是分词的问题。于是边看Solr的管理界面看能发现点啥?
终于QQ群里一哥们说 solr.LowerCaseTokenizerFactory
会过滤掉数字 在Solr的Analysis
菜单下 看到了可以进行分词的演示正对当前的schema.xml配置。还可以选择相应的 field 一试 果真是LowerCaseTokenizerFactory
这个家伙的问题。于是寻找替代方案。经过尝试与搜索。下面的配置
最终解决了数字不能被搜索的问题。(相应的属性也改为此类型)
<fieldType
name="text_inclunum" class="solr.TextField" positionIncrementGap="100">
<analyzer
type="index">
<tokenizer
class="solr.WhitespaceTokenizerFactory"/>
<filter
class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50"
side="front"/>
</analyzer>
<analyzer
type="query">
<tokenizer
class="solr.WhitespaceTokenizerFactory"/>
<filter
class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50"
side="front"/>
</analyzer>
</fieldType>
由于我们库里的产品有拼音字段。而且是大写。
如果我用AMXL 搜索 能搜到相应的拼音。进而搜索相应的产品阿莫西林。(solr配置了all查询。拼音字段copy到了all中。)
可如果我用amxl搜索则不能搜到。于是我在程序中solr的查询语句时把查询值toUpperCase();
终于解决了小写字母不能搜索的问题。
问题二:
但第二天发现引入的了新的问题。如果一个产品是
‘d阿莫西林’ 那么我用d阿莫西林
进行搜索,将不能把 'd阿莫西林'这个产品搜出来。开始不知道为啥,放到Solr的Analysis中一测。发现了。我程序把它变为
‘D阿莫西林’
进行查询了。但SOlr中搜索的却是'd阿莫西林
' ,这次所有已小写字母打头的产品。如果用产品全名如‘‘d阿莫西林’进行搜索(自动补全出来的),将不能搜索出来。
解决了数字的问题。又遇到了小写字母的问题。
这次没有找到个Solr这边的方案。于是打算修改程序。 思路就是
把程序中SOlr的查询值变大写的地方改为。如果查询的值中有中文则不变大写。如果没有则变大写。
这样的话。如果产品是有数字的,或者有小写字母的
都能被搜索出来。 全字母的也能根据拼音搜索出来。("solr.EdgeNGramFilterFactory"
minGramSize="1"
maxGramSize="50")这个就是从左到右一个一个分词的。
于是
网上搜索一个正则查找字符串中是否有中文:
/**
* 判断一个字符串中是否含有中文
* @param str
* @return
*/
public static boolean isContainsChinese(String str)
{
Matcher matcher = Pattern.compile("[\u4e00-\u9fa5]").matcher(str);
boolean flg = false;
if (matcher.find()) {
flg = true;
}
return flg;
} public static String toUpperOrNot(String temp)
{
if (temp == null)
return "";
if(StringUtils.isContainsChinese(temp))
{
return temp;
}else
{
return temp.toUpperCase();
}
}
于是在SOLR查询值的地方调用下toUpperOrNot()即可。最好调用下下面的转义。
温馨提示:
Solr查询中如果查询值中有特殊字符需要转义:
public static final String NEAD_TO_CONVERT_CHAR = "([/:()!])";
// solr query need to convert meaning
public static String convertMeaningChar(String temp)
{
if (temp == null)
return "";
temp = temp.replaceAll(NEAD_TO_CONVERT_CHAR, "\\\\$1");
return temp;
}
Solr 数字字符不能搜索的一个问题的更多相关文章
- solr服务(搜索服务)
1 Solr实现全文搜索 1.1 Solr是什么? Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的 ...
- 基于Solr的空间搜索
如果需要对带经纬度的数据进行检索,比如查找当前所在位置附近1000米的酒店,一种简单的方法就是:获取数据库中的所有酒店数据,按经纬度计算距离,返回距离小于1000米的数据. 这种方式在数据量小的时候比 ...
- 利用SOLR搭建企业搜索平台 之——MultiCore
Solr Multicore 是 solr 1.3 的新特性.其目是一个solr实例,可以有多个搜索应用. 下面着手来将solr给出的一个example跑出来.这篇文章是基于<利用SOLR搭建企 ...
- SOLR搭建企业搜索平台
一. SOLR搭建企业搜索平台 运行环境: 运行容器:Tomcat6.0.20 Solr版本:apache-solr-1.4.0 分词器:mmseg4j-1.6.2 词库:sogou-dic ...
- 【solr基础教程之中的一个】Solr相关知识点串讲
Solr是Apache Lucene的一个子项目.Lucene为全文搜索功能提供了完备的API.但它仅仅作为一个API库存在.而不能直接用于搜索. 因此,Solr基于Lucene构建了一 ...
- Solr实现全文搜索
1.1 Solr是什么? Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展 ...
- 整合Solr与tomcat以及第一个core的配置
整合Solr与tomcat以及第一个core的配置 一.准备安装文件 Tomcat : apache-tomcat-8.5.32.tar.gz Solr:solr-5.3.1.tgz 二.创建目录并解 ...
- 【Solr】 solr对拼音搜索和拼音首字母搜索的支持
问:对于拼音和拼音首字母的支持,当你在搜商品的时候,如果想输入拼音和拼音首字母就给出商品的信息,怎么办呢? 实现方式有2种,但是他们其实是对应的. 用lucene实现 1.建索引, 多建一个索引字段 ...
- 利用SOLR搭建企业搜索平台 之——solr配置solrconfig.xml
来源:http://blog.csdn.net/zx13525079024/article/details/25310781 solrconfig.xml配置文件主要定义了SOLR的一些处理规则,包括 ...
随机推荐
- UVa 10642 - Can You Solve It?
题目:二维平面上的整数点.用路径链接起来(0,0)->(1.0)->(0.1)->(2,0)->.. 给你两点坐标.求两点间步长(在路径上的距离). 分析:简单题. 我们发现点 ...
- 笔试题之xml
XML部分 1.xml有哪些解析技术?区别是什么? 答:有DOM,SAX,STAX等 DOM:处理大型文件时其性能下降的非常厉害.这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM ...
- Oracle查询备注信息
查询表的备注信息: SELECT TABLE_NAME, TABLE_TYPE, COMMENTS FROM USER_TAB_COMMENTS WHERE TABLE_NAME = 'MR_DEPT ...
- HDU 1023 Train Problem II 大数打表Catalan数
一个出栈有多少种顺序的问题.一般都知道是Catalan数了. 问题是这个Catalan数非常大,故此须要使用高精度计算. 并且打表会速度快非常多.打表公式要熟记: Catalan数公式 Cn=C(2n ...
- oracle tnsnames.ora文件用法说明
oracle tnsnames.ora文件用法说明 CreationTime--2018年8月10日08点32分 Author:Marydon 1.用途 oracle客户端所需要的一个文件,通过该 ...
- nginx的Mainline version、Stable version、Legacy version的版本区别
nginx的Mainline version.Stable version.Legacy version的版本区别 创建时间:2014-01-16 10:30:37最后修改:2014-09-23 20 ...
- IP欺骗:要虚拟很多IP的情况:在一台机上虚拟的IP跨网段的处理,可通过在服务器端添加路由来实现
要虚拟很多IP的情况:在一台机上虚拟的IP跨网段的处理,可通过在服务器端添加路由来实现. 例: [服务器] IP:192.168.0.1 [测试机] IP:192.168.0.2 测试机上添加的虚拟 ...
- Linux RAID5+备份盘测试
RAID5磁盘阵列组技术至少需要3块盘来做,加上1块备份盘(这块硬盘设备平时是闲置状态不用工作,一旦RAID磁盘阵列组中有硬盘出现故障后则会马上自动顶替上去),总共是需要向虚拟机中模拟4块硬盘设备. ...
- iOS-APP启动页加载广告
概述 加载广告页, 展现跳过按钮实现倒计时功能, 并判断广告页面是否更新. 详细 代码下载:http://www.demodashi.com/demo/10698.html 目前市场上很多APP(如淘 ...
- MYSQL查询一周内的数据(最近7天的)
select * from wap_content where week(created_at) = week(now) 如果你要严格要求是某一年的,那可以这样 查询一天: select * from ...