Solr配置文件分析与验证
前面一篇开始学习solr的时候,做了个入门的示例http://6738767.blog.51cto.com/6728767/1401865。虽然可以检索出内容,但总和想象的结果有差异——比如,检索“天龙”两个字,按常规理解,就应该只出来《天龙八部》才对,可是竟然也会把《倚天屠龙记》检出来。后来研究了一下,发现系统是这样处理的:无论是抽索引时还是分析检索词时,都把所有文字按单字拆开。这样,刚好《倚天屠龙记》里包含“天”和“龙”。于是对照solr的配置文件schema.xml做了一些分析和验证。下面来看一下:
在schema.xml里,对检索结果有最直接影响的有这么几项:
<solrQueryParserdefaultOperator="OR"/>
这一行在文件较靠后的位置,但我最先拿出来说。这表示,对拆分后的检索词是按照“且”还是“或”的关系选定结果。默认是OR,可以改成AND。象前面例子,如果再有一本《天天向上》,也一样会被检索出来。因为包含了“天”字。那就差的更远了。所以如果采用这个默认的单字拆分法,那最好是用AND,否则结果就太乱了。
好了,假定我们改成了AND,那么结果是《天天向上》没有了,但《倚天屠龙记》还在的。因为既有“天”又有“龙”,说明单字拆分法有不足之处。
决定这个单字拆分法的是谁呢?仔细检查文件,我们发现这一行:
<field name="name"type=" text_general" indexed="true"stored="true"/>
表示name这个字段是text_general类型的。这就靠谱了,多半text_general类型的处理方式就是单字拆分。
有没有更好的分词方法呢,当然有,而且肯定不止一种。我按照网上的例子采用了mmseg4j。使用方法很简单,把解压后的几个jar文件放到classpath目录下。然后在schema.xml里增加下面几行:
<fieldType name="textComplex"class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizerclass="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"mode="complex" dicPath="./dic"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldTypename="textMaxWord" class="solr.TextField"positionIncrementGap="100" >
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"mode="max-word" dicPath="./dic"/>
<filterclass="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="textSimple"class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizerclass="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory"mode="simple" dicPath="./dic"/>
<filterclass="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
这里定义了三种fieldType,分别是textComplex、textMaxWord、textSimple。名称无所谓,重要的是子元素定义了分词器和过滤器使用的类:com.chenlb.mmseg4j.solr.MMSegTokenizerFactory、solr.LowerCaseFilterFactory。其实三种用的类是相同的,只是后面有个mode不同。
这里只是定义了分词类型,我们要把这个分词类型应用到我们的数据里才行。所以,要把<field name="name" type="textSimple"indexed="true" stored="true"/> ——我这里改成了textSimple 。在fieldType和fieldname的共同作用下,我们终于可以完成中文习惯上的分词了。当然要重新运行代码,重新抽索引才行,而且字段name里得有东西(参考上一篇的代码)。
搜索“name:天龙”,结果为空。这又是怎么回事呢?难道又错了?其实如果想看分词效果,solr的管理端有个分析工具很好用。
进到分析页面,上面输入字段名称name,下面输入文本,看一下它倒底是怎么分的
原来textSimple方式把“天龙八部”作为一个整词了,难怪我们搜“天龙”没结果,再搜“天龙八部”,有结果了。晕,这也太不符合习惯了。少字没结果,多字反倒有结果。接着,我们再换一种试试:
<field name="name" type="textMaxWord"indexed="true" stored="true"/> name字段用textMaxWord类型,这表示采用最大化分词的方式。再来分析一下:
这回差不多了,“天龙八部”被分成“天龙”“八”“部”三个词。搜索这三个词都有结果了,而且是唯一结果。
换个搜索写法:
不写name:天龙,直接写天龙。晕死,倚天屠龙记又出来了。接着看schema.xml:
<defaultSearchField>text</defaultSearchField>
这表示默认搜索字段,如果前面什么都不写,就到text里去查找。而text怎么定义的呢?再找:
<field name="text" type="text_general"indexed="true" stored="false"multiValued="true"/>
果然,又回到text_general来了,还是单字拆分法。
等等,回忆一下,我们并没有text这个字段啊(参考上一篇代码),我们只录入了三个字段id、name、price,这个text是谁?继续找,在这里——
<copyField source="cat"dest="text"/>
<copyField source="name"dest="text"/>
<copyField source="manu"dest="text"/>
<copyField source="features"dest="text"/>
<copyField source="includes"dest="text"/>
这几行表示,把cat、name、manu、features、includes都作为text看待(一般是为提供通用检索或简单检索功能用的),text是text_general类型的,还是默认的。所以不写条件时当然又回到单字查找法了。
总结一下:
这5个元素交互作用,最终共同影响着搜索结果。
fieldType:定义了可选的类型,当然定义了未必就用
field:定义了某个字段具体是什么fieldType的
copyField:提供了一个同时查找多个字段的简便方法
defaultSearchField:定义了不写字段条件时的查找范围
solrQueryParser defaultOperator:定义了各分词之间采用什么逻辑组合
转载于:https://blog.51cto.com/8969167/1416646
相关文章:

oracle启用归档日志
一、开启归档 1、查看归档信息 SQL> archive log list Database log mode No Archive Mode Automatic archival Disabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 244 Current log sequence …

C++派生类与基类构造函数调用次序
本文用来测试C基类和派生类构造函数,析构函数,和拷贝构造函数的调用次序。运行环境:SUSE Linux Enterprise Server 11 SP2 (x86_64) #include <iostream>using namespace std;class Base{public:Base(){cout << "Base Cons…

Java项目:在线点餐系统(java+Springboot+Maven+mybatis+Vue+mysql+Redis)
源码获取:博客首页 "资源" 里下载! 项目描述: 这是一个基于SpringBootVue框架开发的在线点餐系统。首先,这是一个前后端分离的项目。具有一个在线点餐系统该有的所有功能。 项目功能: 此项目分为两个角色&…

js 打开窗口window.open
js改变原有的地址 window.open(webPath/index?codecode,_self); 转载于:https://www.cnblogs.com/hwaggLee/p/4645680.html

中兴SDH原理介绍及中兴E300网管介绍
姓名苟忠兴培训课程中兴SDH原理介绍及中兴E300网管介绍培训心得1、 SDH概念:SDH(Synchronous Digital Hierarchy,同步数字体系)是一种将复接、线路传输及交换功能融为一体、并由统一网管系统操作的综合信息传送网络。2、 PDH缺点&…

bootstrap 冻结表格,冻结表头
需要的文件下载: bootstrap-table:https://github.com/wenzhixin/bootstrap-table bootstrap-table-fiex-column:https://github.com/wenzhixin/bootstrap-table-fixed-columns 参考来源:https://www.cnblogs.com/Kyaya/p/9004237.html 1.引入文件 2. bo…

Linux多线程与同步
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 典型的UNIX系统都支持一个进程创建多个线程(thread)。在Linux进程基础中提到,Linux以进程为单位组织操作,Linux中的线程也…

Java项目:校园外卖点餐系统(java+SSM+JSP+maven+mysql)
源码获取:博客首页 "资源" 里下载! 一、项目简述 环境配置: Jdk1.8 Tomcat8.5 mysql Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) 项目技术: JSP Spring SpringMVC MyBatis cs…

基于css3 transform实现散乱的照片排列
分享一款基于css3 transform实现散乱的照片排列。这是一款简单零散的css3相册排列特效下载。效果图如下: 在线预览 源码下载 实现的代码。 html代码: <div class"main"><div class"pic pic1"><img src"1.jpg…

C++利用二级指针做函数形参来进行修改实参的实例分析
在学C/C的时候,我们都会了解到一级指针,int* i NULL; 和二级指针int ** pp NULL; 但是具体的一些应用我们可能很难理解,如果我们要取int*的地址,我们就需要int**,这是因为指针传递本质上还是值传递,本质很难理解&a…

SpringBoot 优雅实现超大文件上传,通用方案
通俗的说,你把要上传的东西上传,服务器会先做MD5校验,如果服务器上有一样的东西,它就直接给你个新地址,其实你下载的都是服务器上的同一个文件,想要不秒传,其实只要让MD5改变,就是对文件本身做一下修改(改名字不行),例如一个文本文件,你多加几个字,MD5就变了,就不会秒传了。分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。

robotframework - 运行报错提示 No keyword with name 'Open Browser' found.
用下面的例子为例: 1、输入以上robot脚本提示: 2、经查阅资料,大部分都使用的是selenium2 版本,无法解该的问题,目前小编使用的是selenium3,不知道selenium是哪个版本的话,用pip show selenium…

Linux从程序到进程
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 计算机如何执行进程呢?这可以说是计算机运行的核心问题。即使我们已经编写好程序,但程序是死的文本,只有成为…

struct stat结构体的详解和用法
[cpp] view plaincopy//! 需要包含de头文件 #include <sys/types.h> #include <sys/stat.h> S_ISLNK(st_mode):是否是一个连接.S_ISREG(st_mode):是否是一个常规文件.S_ISDIR(st_mode):是否是一个目录S_ISCHR(st_mode)&a…

反射setaccessible_反射技术
反射机制作用动态的加载类、动态的获取类的信息(属性,方法,构造器)动态构造对象动态调用类和对象的任意方法、构造器动态调用和处理属性获取泛型信息处理注解获取Class对象的方式有哪些?1. Class clazz Class.forName(全限定类名);2. 类名.c…

pthread_cond_wait()函数的详解
http://hi.baidu.com/tjuer/item/253cc6d66b921317d90e4483 了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线程信号发送系统的核心,也是最难以理解的部分。 首先,让我们考虑以下情况:线程为查看已链接列表而锁定了互斥对象&#x…

CentOS7下python虚拟环境
搭建python虚拟环境 1.我们先创建一个隐藏目录 .virtualenvs,所有的虚拟环境都放在此目录下 :mkdir /root/.virtualenvs 2.安装虚拟环境 确认pip:whereis pip3 pip3 install virtualenv 安装virtualenvwrapper,为避免超时错误&…

WCDMA中的URA和LA/RA
1、关于URA的概念:URA(UTRAN Registration Area)是UTRAN内部区域的划分适用于UE处于RRC连接状态的情形,而且只能在UTRAN端使用(比如由UTRAN发起的寻呼)。一 个URA包含了一个或多个Cell,具体由决…

背景音乐的实现
通过利用Service来实现该功能将要播放的歌曲放入raw文件夹中[html] view plaincopy <strong>新建一个AudioService 类,<span style"font-family: Arial, Helvetica, sans-serif;">AudioService 类</span><span style"font-fami…

打牌软件可以控制吗_使用crm软件真的可以帮助企业省钱吗
使用crm软件真的可以帮助企业省钱吗大多数企业管理者认为:“客户关系系统有什么用?真的可以帮助企业发展吗?自己做一套excel版本不就行了”其实,不以为然,当我们去寻找用户时或者管理用户需要工作人员做一些繁琐的事情会极大的降低员工的工…

MS_SQL_获取字符串最后出现的字符串及位置
一.如:6.7.8.2.3.4.x得到最后一个.后面的字符串: declare str1 varchar(50) set str16.7.8.2.3.4.x select REVERSE(SUBSTRING(REVERSE(str1),1,CHARINDEX(.,REVERSE(str1))-1)) -------- string:x-- --------------------------------------…

redis(3)-redis基本类型
在redis安装目录下存在redis自带的客户端,启动即可使用。如果设置了密码,需要输入auth 123456进行验证。123456为密码。 redis的基本数据类型: 1.字符串类型(String) redis 127.0.0.1:6379> SET mykey "redis" OK redis 1…

虚函数与虚继承寻踪
封装、继承、多态是面向对象语言的三大特性,熟悉C的人对此应该不会有太多异议。C语言提供的struct,顶多算得上对数据的简单封装,而C的引入把struct“升级”为class,使得面向对象的概念更加强大。继承机制解决了对象复用的问题&…

信息记录拉取失败_天猫入驻为什么失败?猫店侠做详细解读
天猫入驻为什么失败?这是很多商家都想要知道的一件事情,猫店侠想说其实这也很正常,只要不是一味盲目的入驻,就还有机会。首先失败商家要看看失败的反馈内容,看看是哪方面不达标,再着重进行补充,…

Linux查看目录挂载点
用命令 df 即可 # df /var/lib/ Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 135979984 66905292 62055896 52% /加上-kh更容易看些: # df /var/lib/ -kh Filesystem Size Used Avail Use% Mounted o…

Android:你好,androidX!再见,android.support
190325 补充:莫名问题的解决 181106 补充:修改未迁移成功的三方库 1、AndroidX简介 点击查看Android文档中对androidx的简介 按照官方文档说明 androidx 是对 android.support.xxx 包的整理后产物。由于之前的support包过于混乱,所以…

设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。 本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解…

云计算和大数据时代网络技术揭秘(八)数据中心存储FCoE
数据中心存储演化——FCoE数据中心三大基础:主机 网络 存储在云计算推动下,存储基础架构在发生演变传统存储结构DAS、SAN在发展中遇到了布线复杂、能耗增多的缺点(原生性),需要对架构做根本的改变。FCoE是业界无可争议…

在plsql里面怎么去掉空行_盐渍樱花怎么做?详细做法告诉您,一年都不会坏,学会再也不用买...
盐渍樱花怎么做?详细做法告诉您,一年都不会坏,赶紧收藏学会它!樱花季说的就是现在,虽然到了飘落的季节,但是还是到处可见的樱花朵朵。俗话说:花无百日红。真的是啊,每年的三四月是最…

Linux基础知识——常用shell命令介绍(三)
一、改变文件权限 chmod:change mode 语法:# chmod [选项-option] 权限 FILE 选项:-R 递归修改权限 --reference 参照文件或目录给予权限 权限定义方式: 1.同时修改三类用户的权限: 8进制数字方式 # chmod 666 /abc /*将/abc的权限改为…