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;
}
相关文章
- 使用Github的高级搜索功能
- destoon搜索伪静态失败解决办法
- Java实现 LeetCode 538 把二叉搜索树转换为累加树(遍历树)
- python code practice(二):KMP算法、二分搜索的实现、哈希表
- LeetCode(96): 不同的二叉搜索树
- SAP S/4HANA Customer Management里的页面搜索结果的分页显示原理
- 使用ABAP memory inspector分析product 搜索内存占用
- AI:2020年6月23日北京智源大会演讲分享之智能信息检索与挖掘专题论坛——09:10-09:55裴健教授《智能搜索:从工具到思维方式和心智》
- android 10.0 Settings去掉二级三级菜单搜索功能
- 基于爬山优化算法的三维曲面极值搜索matlab仿真
- 搜索文件中是否存在关键字
- 2364. 统计坏数对的数目-数学推导转化+快速排序-搜索相同元素集合题解
- 【MATLAB】matlab 文档使用 ( 文档查询 | 文档层次 | 自带搜索工具 | 帮助命令 | 学习导引 )
- python里使用正则表达式搜索单词
- google搜索 site:pku.edu.cn inurl:aspx 即可查找所有动态网页 =====html(静态网页) asp(动态) jsp(动态) php(动态) cgi(网络程序) aspx(动态)
- 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
- 5.IDA-文本搜索、二进制搜索(16进制字节序列)、替换16进制
- 04-树4 是否同一棵二叉搜索树
- 云原生之使用Docker部署Linux命令大全搜索工具