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;
	}
时间: 2024-08-26 12:35:04

Solr 数字字符不能搜索的一个问题的相关文章

利用SOLR搭建企业搜索平台 之——MultiCore

Solr Multicore 是 solr 1.3 的新特性.其目是一个solr实例,可以有多个搜索应用. 下面着手来将solr给出的一个example跑出来.这篇文章是基于<利用SOLR搭建企业搜索平台 之——运行solr>,有不明白的请参见http://lianj-lee.javaeye.com/blog/424383 1. 找到solr下载包中的example文件夹,在它的下面有个multicore文件夹,将这个文件夹下面的所有东西copy到 c:/solr-tomcat/solr下面.

【solr基础教程之中的一个】Solr相关知识点串讲

Solr是Apache Lucene的一个子项目.Lucene为全文搜索功能提供了完备的API.但它仅仅作为一个API库存在.而不能直接用于搜索. 因此,Solr基于Lucene构建了一个完整的搜索引擎.它能够为搜索引擎加入文档.对文档内容进行分析,并为用户提供搜索功能,在此基础上提供了一个扩展功能,如hit highline, suggetion等. 一.概述 (一)基础内容 1.Solr的版本与Lucene的版本保持一直,直到2014年7月,最新版本为4.9.0. 2.Solr提供了一个ex

利用SOLR搭建企业搜索平台 之——solr配置solrconfig.xml

solrconfig.xml这个配置文件可以在你下载solr包的安装解压目录的E:\Work\solr-4.2.0-src-idea\solr\example\solr\collection1\conf中找到,这个配置文件内容有点多,主要内容有:使用的lib配置,包含依赖的jar和Solr的一些插件;组件信息配置;索引配置和查询配置,下面详细说一下索引配置和查询配置. 1索引indexConfig Solr 性能因素,来了解与各种更改相关的性能权衡. 下表概括了可控制 Solr 索引处理的各种因

[ jquery 过滤器 siblings(expr) ] 此方法用于在选择器的基础之上搜索取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合,可以用可选的表达式进行筛选

此方法用于在选择器的基础之上搜索取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合,可以用可选的表达式进行筛选 实例: <html lang='zh-cn'> <head> <title>Insert you title</title> <meta http-equiv='description' content='this is my page'> <meta http-equiv='keywords' content='

整合Solr与tomcat以及第一个core的配置

整合Solr与tomcat以及第一个core的配置 一.准备安装文件 Tomcat : apache-tomcat-8.5.32.tar.gz Solr:solr-5.3.1.tgz 二.创建目录并解压文件到指定目录下 solr_server (如下图) 将下载好的Tomcat文件解压到此目录 三.将solr-5.3.1\server\solr-webapp 下的webapp 文件夹拷贝到tomcat8\webapps 目录下,并改名为SHFW_SEARCH,目录结构如下图 四. 进入到solr

solr学习之一 搜索基本知识

学习了一段时间的solr了,用自己的方式总结下目前学到的内容,这是个系列文章,这里面的有些说法可能不准确,也可能有问题 欢迎大家指正. 一.搜索引擎目的 搜索引擎在我们的生活中,已经无处不在,除了我们常用的baidu.Google等,还有一些电商的搜索 比如亚马逊搜书等.除了网页搜索外,企业内部可能涉及到知识库搜索,一般称为企业搜索.现在搜索要主要的目的是,在海量信息中,从非结构化数据中快速找到符合我们含义的信息.注意这里的几个关键词语. "海量信息"  :搜索引擎一般处理的数据量很大

【Solr】 solr对拼音搜索和拼音首字母搜索的支持

问:对于拼音和拼音首字母的支持,当你在搜商品的时候,如果想输入拼音和拼音首字母就给出商品的信息,怎么办呢? 实现方式有2种,但是他们其实是对应的.  用lucene实现 1.建索引, 多建一个索引字段,即拼音和拼音首字母这2个字段.合并的一个字段.  (拼音和拼音首字母,可以通过pinyin4j.jar.将想要进行拼音搜索的字段进行拼音转换.) 2.对输入的参数判断是否是拼音,(可以通过将传人的值转换为 utf-8 形式,如果转换后的字符串长度大于原来的字符串的长度,那么就不是拼音.否则就进行拼

solr 搜索引擎及搜索推荐应用

搜索框里输入关键字,从mongodb里搜索出关键字相关关键字记录.用户从相关关键字里选取一个作为最后关键字从solr里查询数据. 1创建索引:从sql里goodsinfo表查所有记录,solr.AddRange();solr.Commit() 即可创建索引2客户端每次搜索一次在sql表里searchLog 记录一条记录3自动推荐:从mongodb里直接查关键字相关记录及相关商品数量:mongodb记录了关键字及商品数量(solr搜索结果量). --服务1:每天从goodsinfo表更新solr数

solr 近实时搜索

摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到. Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merge)的完成而是直接检索索引并返回数据.参见原文 利用NRT,就可以设置soft commit,因为标准的commit操作代价高昂,soft commit可以做到近乎实时的查询效果而不丢失数据. Commits 与 Optimizing 一个commit操作可以使新的查询请求能够感知到索引的变化,一般