前面一篇开始学习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

Solr配置文件分析与验证相关推荐

  1. 安全扫描失败无法上传_Apache Solr 未授权上传(RCE)漏洞的原理分析与验证

    漏洞简介 Apache Solr 发布公告,旧版本的ConfigSet API 中存在未授权上传漏洞风险,被利用可能导致 RCE (远程代码执行). 受影响的版本: Apache Solr6.6.0 ...

  2. Apache Solr 未授权上传(RCE)漏洞(CVE-2020-13957)的原理分析与验证

     聚焦源代码安全,网罗国内外最新资讯! 01 漏洞简介 Apache Solr 发布公告,旧版本的ConfigSet API 中存在未授权上传漏洞风险,被利用可能导致 RCE (远程代码执行). 受影 ...

  3. Solr配置文件详解

    1  概述 Solr配置文件位于solr/conf目录下,因各个版本的solr目录不太一致,所以下面以solr5.x或者以上版本来说明相关配置文件的参数及一些相关作用. 2  目录结构说明 官网下载s ...

  4. Enterprise Library: Data Access Application Block配置文件分析篇

    Enterprise Library: Data Access Application Block配置文件分析篇 Enterprise Library提供了Configuration Console配 ...

  5. 【开发环境】Ubuntu 中使用 VSCode 开发 C/C++ ④ ( 创建 tasks.json 编译器构建配置文件 | tasks.json 编译器构建配置文件分析 )

    文章目录 一.创建 tasks.json 编译器构建配置文件 二.tasks.json 编译器构建配置文件分析 可以参考官方提供的文档 : https://code.visualstudio.com/ ...

  6. axivion和astree_Axivion架构分析及验证工具

    德国Axivion公司 德国Axivion 公司是一家完全自主的技术公司,公司保持持续增长,在软件开发解决方案领域拥有超过10年的经验.作为源于斯图加特大学的公司, Axivion公司提供了一个良好的 ...

  7. Symtavision—分布式嵌入式系统时间建模分析和验证工具

    Symtavision工具为Luxoft公司提供的一款分布式嵌入式系统时间特性建模.分析和验证工具,主要应用于汽车领域.经纬恒润联合Symtavision工具厂商能够为客户提供完整的系统级时间特性建模 ...

  8. vue-cli的webpack模板项目配置文件分析[转]

    vue-cli的webpack模板项目配置文件分析[转] 原文出处:http://blog.csdn.net/hongchh/article/details/55113751 由于最近在vue-cli ...

  9. 人工智能软件的分析与验证(1) - AI软件的可靠性与落地方法

    人工智能软件的分析与验证(1) - AI软件的可靠性与落地方法 随着深度学习革命的不断发展,AI算法驱动的软件产品越来越影响我们的生活.比如人脸识别.机器翻译等应用越来越广泛,技术也在像纵深方向发展, ...

最新文章

  1. javaweb开发3.基于Servlet+JSP+JavaBean开发模式的用户登录注册
  2. 海洋分享lol皮肤插件_LOL手游:能否火起来,梦泪测试后给出评价,网友:说的太真实了...
  3. 皮一皮:这个老爸有觉悟...
  4. 动态规划——区间dp
  5. NSString 用法总结与陷阱
  6. 【转载】linux中误删除oracle数据文件的恢复操作
  7. Python基础-包
  8. CentOS7安装Oracle11g R2全过程
  9. Android与server通信的方法之中的一个(json)效率不高安全性不好
  10. C语言极坐标转直角坐标,C语言实现直角坐标转换为极坐标的方法
  11. java 怎么获取object的数据_自学java,想将来从事大数据工作,现实吗?怎么学?...
  12. Cisco PBR Case2
  13. 这 26个中国式创新,征服了全世界
  14. 设计师配色宝典:教你从零开始学配色
  15. ShuffleNet算法详解
  16. C++ 实现一个虚拟聊天软件
  17. 前端移动端开发(基础)
  18. Could not find acceptable representation 原因探究
  19. Java简介与JDK安装
  20. 碟评--梁紫丹新碟<<紫色的声音>>

热门文章

  1. lede 插件_家中路由换新——lede软路由安装教程
  2. python os open_Python3 os.open() 方法
  3. c语言随机数生成0 99函数,C语言生成随机数的函数、延时函数
  4. php常见排序算去,PHP兑现常见排序算法
  5. linux 硬盘操作,linux常用disk磁盘操作命令
  6. prometheus--初见
  7. layoutSubviews 调用情况
  8. [USACO07NOV]Cow Relays
  9. 《重构-改善既有代码的设计》读书笔记(二)
  10. 实战证明LINUX系统下密钥对验证的安全性