solr 文件内容全文搜索 怎么截取部分内容

全文检索引擎Solr系列——Solr核心概念、配置文件 - ImportNew
| 分类: ,
Document是Solr索引(动词,indexing)和搜索的最基本单元,它类似于关系数据库表中的一条记录,可以包含一个或多个字段(Field),每个字段包含一个name和文本值。字段在被索引的同时可以存储在索引中,搜索时就能返回该字段的值,通常文档都应该包含一个能唯一表示该文档的id字段。例如:
&field name=&id&&company123&/field&
&field name=&companycity&&Atlanta&/field&
&field name=&companystate&&Georgia&/field&
&field name=&companyname&&Code Monkeys R Us, LLC&/field&
&field name=&companydescription&&we write lots of code&/field&
&field name=&lastmodified&&T15:26:37Z&/field&
Solr中的Schema类似于关系数据库中的表结构,它以schema.xml的文本形式存在在conf目录下,在添加文当到索引中时需要指定Schema,Schema文件主要包含三部分:字段(Field)、字段类型(FieldType)、唯一键(uniqueKey)
字段类型(FieldType):用来定义添加到索引中的xml文件字段(Field)中的类型,如:int,String,date,
字段(Field):添加到索引文件中时的字段名称
唯一键(uniqueKey):uniqueKey是用来标识文档唯一性的一个字段(Feild),在更新和删除时用到
&schema name=&example& version=&1.5&&
&field name=&id& type=&string& indexed=&true& stored=&true& required=&true& multiValued=&false& /&
&field name=&title& type=&text_general& indexed=&true& stored=&true& multiValued=&true&/&
&uniqueKey&id&/uniqueKey&
&fieldType name=&string& class=&solr.StrField& sortMissingLast=&true& /&
&fieldType name=&text_general& class=&solr.TextField& positionIncrementGap=&100&&
&analyzer type=&index&&
&tokenizer class=&solr.StandardTokenizerFactory&/&
&filter class=&solr.StopFilterFactory& ignoreCase=&true& words=&stopwords.txt& /&
&!-- in this example, we will only use synonyms at query time
&filter class=&solr.SynonymFilterFactory& synonyms=&index_synonyms.txt& ignoreCase=&true& expand=&false&/&
&filter class=&solr.LowerCaseFilterFactory&/&
&/analyzer&
&analyzer type=&query&&
&tokenizer class=&solr.StandardTokenizerFactory&/&
&filter class=&solr.StopFilterFactory& ignoreCase=&true& words=&stopwords.txt& /&
&filter class=&solr.SynonymFilterFactory& synonyms=&synonyms.txt& ignoreCase=&true& expand=&true&/&
&filter class=&solr.LowerCaseFilterFactory&/&
&/analyzer&
&/fieldType&
在Solr中,字段(Field)是构成Document的基本单元。对应于数据库表中的某一列。字段是包括了名称,类型以及对字段对应的值如何处理的一种元数据。比如:
&field name="name" type="text_general" indexed="true" stored="true"/&
Indexed:Indexed=true时,表示字段会加被Sorl处理加入到索引中,只有被索引的字段才能被搜索到。
Stored:Stored=true,字段值会以保存一份原始内容在在索引中,可以被搜索组件组件返回,考虑到性能问题,对于长文本就不适合存储在索引中。
Field Type
Solr中每个字段都有一个对应的字段类型,比如:float、long、double、date、text,Solr提供了丰富字段类型,同时,我们还可以自定义适合自己的数据类型,例如:
&!-- Ik 分词器 --&
&fieldType name=&text_cn_stopword& class=&solr.TextField&&
&analyzer type=&index&&
&tokenizer class=&org.wltea.analyzer.lucene.IKAnalyzerSolrFactory& useSmart=&false&/&
&/analyzer&
&analyzer type=&query&&
&tokenizer class=&org.wltea.analyzer.lucene.IKAnalyzerSolrFactory& useSmart=&true&/&
&/analyzer&
&/fieldType&
&!-- Ik 分词器 --&
Solrconfig:
如果把Schema定义为Solr的Model的话,那么Solrconfig就是Solr的Configuration,它定义Solr如果处理索引、高亮、搜索等很多请求,同时还指定了缓存策略,用的比较多的元素包括:
指定索引数据路径
Used to specify an alternate directory to hold all index data
other than the default ./data under the Solr home.
If replication is in use, this should match the replication configuration.
&dataDir&${solr.data.dir:./solr/data}&/dataDir&
&filterCache
class=&solr.FastLRUCache&
size=&512&
initialSize=&512&
autowarmCount=&0&/&
&!-- queryResultCache caches results of searches - ordered lists of
document ids (DocList) based on a query, a sort, and the range
of documents requested.
&queryResultCache
class=&solr.LRUCache&
size=&512&
initialSize=&512&
autowarmCount=&0&/&
&!-- documentCache caches Lucene Document objects (the stored fields for each document).
Since Lucene internal document ids are transient, this cache will not be autowarmed.
&documentCache
class=&solr.LRUCache&
size=&512&
initialSize=&512&
autowarmCount=&0&/&
请求处理器
请求处理器用于接收HTTP请求,处理搜索后,返回响应结果的处理器。比如:query请求:
&!-- A request handler that returns indented JSON by default --&
&requestHandler name=&/query& class=&solr.SearchHandler&&
&lst name=&defaults&&
&str name=&echoParams&&explicit&/str&
&str name=&wt&&json&/str&
&str name=&indent&&true&/str&
&str name=&df&&text&/str&
&/requestHandler&
每个请求处理器包括一系列可配置的搜索参数,例如:wt,indent,df等等。
关于作者:
程序员,关注 Java、Python、云计算,移动互联网。(新浪微博:)
我是没觉得你这样改让代码变得优雅了
花溪的小石头
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2017 ImportNew2Solr实现全文搜索 - CSDN博客
2Solr实现全文搜索
1.1&Solr是什么?
Solr 是下的一个顶级开源项目,采用开发,它是基于的全文搜索服务器。提供了比更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。
1.2&Solr的安装及配置
Solr的版本:
需要把服务器安装到环境:
第一步:安装、、。
[root@bogon ~]# ll
total 8044
-rw-r--r--. 1 root root 8234674 Oct 27 &2013 apache-tomcat-7.0.47.tar.gz
[root@bogon ~]# tar -zxf apache-tomcat-7.0.47.tar.gz
[root@bogon ~]# ll
total 8048
drwxr-xr-x. 9 root root &&&4096 Sep 10 17:55 apache-tomcat-7.0.47
-rw-r--r--. 1 root root 8234674 Oct 27 &2013 apache-tomcat-7.0.47.tar.gz
[root@bogon ~]# mkdir /usr/local/solr
[root@bogon ~]# cp apache-tomcat-7.0.47 /usr/local/solr/tomcat
cp: omitting directory `apache-tomcat-7.0.47'
[root@bogon ~]# cp apache-tomcat-7.0.47 /usr/local/solr/tomcat -r
[root@bogon ~]# cd /usr/local/solr/
[root@bogon solr]# ll
drwxr-xr-x. 9 root root 4096 Sep 10 17:56 tomcat
[root@bogon solr]#
第二步:把的压缩包上传到服务器。并解压。
第三步:把包部署到下。并改名为
[root@bogon dist]# cp solr-4.10.3.war /usr/local/solr/tomcat/webapps/solr.war
第四步:解压包。启动自动解压。关闭。删除
第五步:把目录下所有的包复制到工程中。
[root@bogon ext]# cp * /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
第六步:创建。是存放服务器所有配置文件的目录。
[root@bogon example]# pwd
/root/solr-4.10.3/example
[root@bogon example]# cp -r solr /usr/local/solr/solrhome
[root@bogon example]#
第七步:告诉服务器的位置。
需要修改工程的文件。
第八步:启动tomcat
1.1.1&配置业务字段
1、在中默认是中文分析器,需要手工配置。配置一个,在中指定中文分析器。
2、中的字段必须是先定义后使用。
1.1.1.1&中文分析器的配置
本文已收录于以下专栏:
相关文章推荐
       Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性...
from http://blog.csdn.net/ssh_kobe/article/details/6768836
Solrj已经是很强大的solr客户端了。它本身就包装了httpCliet,...
说起Apache Lucene,可以说无人不知,无人不晓,但是说道Apache Solr,恐怕知道的不多。看看Apache Solr的说明:
Solr是一个基于Lucene java库的企业...
Solrj已经是很强大的solr客户端了。它本身就包装了httpCliet,以完全对象的方式对solr进行交互。很小很好很强大。
    不过在实际使用中,设置SolrQuery 的过程中,为了设置...
利用SOLR搭建企业搜索平台 之一(运行solr)
   在网络上找了很多的关于solr的资料,发现非常的不全面,即使就是官方的wiki,也是如此!
  基于现阶段正在研究的solr应 用...
/blog/1074238
/blog/1074265
其中solr服务类:
from http://blog.csdn.net/ssh_kobe/article/details/6768625
利用SOLR搭建企业搜索平台 之一(运行solr)
   在网络上找了很多...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)solr全文检索_初级教程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
solr全文检索_初级教程
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢以前发布过的Lucene插件,后来很多人跟我说其实Solr更流行(反正我是觉得既然Solr是Lucene的子项目,那么稍微改改配置就能支持Solr),于是就抽空做了个Solr插件出来,开源在上,欢迎改进。
HanLP中文分词solr插件支持Solr5.x,兼容Lucene5.x。
将和共两个jar放入${webapp}/WEB-INF/lib下
修改solr core的配置文件${core}/conf/schema.xml:
&&&fieldType&name=&text_cn&&class=&solr.TextField&&
&&&&&&&analyzer&type=&index&&
&&&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&true&/&
&&&&&&&/analyzer&
&&&&&&&analyzer&type=&query&&
&&&&&&&&&&&!--&切记不要在query中开启index模式&--&
&&&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&false&/&
&&&&&&&/analyzer&
&&&/fieldType&
&&&!--&业务系统中需要分词的字段都需要指定type为text_cn&--&
&&&field&name=&my_field1&&type=&text_cn&&indexed=&true&&stored=&true&/&
&&&field&name=&my_field2&&type=&text_cn&&indexed=&true&&stored=&true&/&
Solr5中文分词器详细配置
对于新手来说,上面的两步可能太简略了,不如看看下面的step by step。本教程使用Solr5.2.1,理论上兼容solr5.x。
将上述两个jar放到solr-5.2.1/server/solr-webapp/webapp/WEB-INF/lib目录下。
首先在solr-5.2.1\bin目录下启动solr:
solr&start&-f
用浏览器打开,看到如下页面说明一切正常:
在solr-5.2.1\server\solr下新建一个目录,取个名字比如叫one,将示例配置文件solr-5.2.1\server\solr\configsets\sample_techproducts_configs\conf拷贝过来,接着修改schema.xml中的默认域type,搜索
&&&&&fieldType&name=&text_general&&class=&solr.TextField&&positionIncrementGap=&100&&
&&&&&&&&...
&&&&&/fieldType&
&&&&&!--&默认文本类型:&指定使用HanLP分词器,同时开启索引模式。
&通过solr自带的停用词过滤器,使用&stopwords.txt&(默认空白)过滤。
&在搜索的时候,还支持solr自带的同义词词典。--&
&&&&&fieldType&name=&text_general&&class=&solr.TextField&&positionIncrementGap=&100&&
&&&&&&&analyzer&type=&index&&
&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&true&/&
&&&&&&&&&filter&class=&solr.StopFilterFactory&&ignoreCase=&true&&words=&stopwords.txt&&/&
&&&&&&&&&!--&取消注释可以启用索引期间的同义词词典
&&&&&&&&&filter&class=&solr.SynonymFilterFactory&&synonyms=&index_synonyms.txt&&ignoreCase=&true&&expand=&false&/&
&&&&&&&&--&
&&&&&&&&&filter&class=&solr.LowerCaseFilterFactory&/&
&&&&&&&/analyzer&
&&&&&&&analyzer&type=&query&&
&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&true&/&
&&&&&&&&&filter&class=&solr.StopFilterFactory&&ignoreCase=&true&&words=&stopwords.txt&&/&
&&&&&&&&&filter&class=&solr.SynonymFilterFactory&&synonyms=&synonyms.txt&&ignoreCase=&true&&expand=&true&/&
&&&&&&&&&filter&class=&solr.LowerCaseFilterFactory&/&
&&&&&&&/analyzer&
&&&&&/fieldType&
意思是默认文本字段类型启用HanLP分词器,text_general还开启了solr默认的各种filter。
solr允许为不同的字段指定不同的分词器,由于绝大部分字段都是text_general类型的,可以说这种做法比较适合新手。如果你是solr老手的话,你可能会更喜欢单独为不同的字段指定不同的分词器及其他配置。如果你的业务系统中有其他字段,比如location,summary之类,也需要一一指定其type=&text_general&。切记,否则这些字段仍旧是solr默认分词器,会造成这些字段“搜索不到”。
另外,切记不要在query中开启indexMode,否则会影响PhaseQuery。indexMode只需在index中开启一遍即可,要不然它怎么叫indexMode呢。
如果你不需要solr提供的停用词、同义词等filter,如下配置可能更适合你:
&&&fieldType&name=&text_cn&&class=&solr.TextField&&
&&&&&&&analyzer&type=&index&&
&&&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&true&/&
&&&&&&&/analyzer&
&&&&&&&analyzer&type=&query&&
&&&&&&&&&&&!--&切记不要在query中开启index模式&--&
&&&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&false&/&
&&&&&&&/analyzer&
&&&/fieldType&
&&&!--&业务系统中需要分词的字段都需要指定type为text_cn&--&
&&&field&name=&my_field1&&type=&text_cn&&indexed=&true&&stored=&true&/&
&&&field&name=&my_field2&&type=&text_cn&&indexed=&true&&stored=&true&/&
完成了之后在solr的管理界面导入这个core one:
接着就能在下拉列表中看到这个core了:
上传测试文档
修改好了,就可以拿一些测试文档来试试效果了。hanlp-solr-plugin代码库中的src/test/resources下有个测试文档集合documents.csv,其内容如下:
1,你好世界
2,商品和服务
3,和服的价格是每镑15便士
4,服务大众
5,hanlp工作正常
代表着id从1到5共五个文档,接下来复制solr-5.2.1\example\exampledocs下的上传工具post.jar到resources目录,利用如下命令行将数据导入:
java&-Dc=one&-Dtype=application/csv&-jar&post.jar&*.csv
Windows用户的话直接双击该目录下的upload.cmd即可,Linux用户运行upload.sh。
正常情况下输出如下结果:
SimplePostTool&version&5.0.0
Posting&files&to&[base]&url&http://localhost:8983/solr/one/update&using&content-
type&application/csv...
POSTing&file&documents.csv&to&[base]
1&files&indexed.
COMMITting&Solr&index&changes&to&http://localhost:8983/solr/one/update...
Time&spent:&0:00:00.059
请按任意键继续.&.&.
同时刷新一下core one的Overview,的确看到了5篇文档:
是时候看看HanLP分词的效果了,点击左侧面板的Query,输入“和服”试试:
发现精确地查到了“和服的价格是每镑15便士”,而不是“商品和服务”这种错误文档:
这说明HanLP工作良好。
要知道,不少中文分词器眉毛胡子一把抓地命中“商品和服务”这种错误文档,降低了查准率,拉低了用户体验,跟原始的MySQL LIKE有何区别?
索引模式的功能
索引模式可以对长词进行全切分,得到其中蕴含的所有词汇。比如“中医药大学附属医院”在HanLP索引分词模式下的切分结果为:
中0&医1&药2&大3&学4&附5&属6&医7&院8&
[0:3&1]&中医药/n
[0:2&1]&中医/n
[1:3&1]&医药/n
[3:5&1]&大学/n
[5:9&1]&附属医院/nt
[5:7&1]&附属/vn
[7:9&1]&医院/n
开启indexMode后,无论用户搜索“中医”“中医药”还是“医药”,都会搜索到“中医药大学附属医院”:
目前本插件支持如下基于schema.xml的配置:
配置项名称
enableIndexMode
设为索引模式
enableCustomDictionary
是否启用用户词典
customDictionaryPath
用户词典路径(绝对路径或程序可以读取的相对路径,多个词典用空格隔开)
stopWordDictionaryPath
停用词词典路径
enableNumberQuantifierRecognize
是否启用数词和数量词识别
enableNameRecognize
开启人名识别
enableTranslatedNameRecognize
是否启用音译人名识别
enableJapaneseNameRecognize
是否启用日本人名识别
enableOrganizationRecognize
开启机构名识别
enablePlaceRecognize
开启地名识别
enableNormalization
是否执行字符正规化(繁体-&简体,全角-&半角,大写-&小写)
enableTraditionalChineseMode
开启精准繁体中文分词
对于更高级的配置,HanLP分词器主要通过class path下的hanlp.properties进行配置,请阅读以了解更多相关配置,如:
在Query改写的时候,可以利用HanLPAnalyzer分词结果中的词性等属性,如
String&text&=&&中华人民共和国很辽阔&;
for&(int&i&=&0;&i&&&text.length();&++i)
&&&&System.out.print(text.charAt(i)&+&&&&+&i&+&&&&);
System.out.println();
Analyzer&analyzer&=&new&HanLPAnalyzer();
TokenStream&tokenStream&=&analyzer.tokenStream(&field&,&text);
tokenStream.reset();
while&(tokenStream.incrementToken())
&&&&CharTermAttribute&attribute&=&tokenStream.getAttribute(CharTermAttribute.class);
&&&&//&偏移量
&&&&OffsetAttribute&offsetAtt&=&tokenStream.getAttribute(OffsetAttribute.class);
&&&&//&距离
&&&&PositionIncrementAttribute&positionAttr&=&kenStream.getAttribute(PositionIncrementAttribute.class);
&&&&//&词性
&&&&TypeAttribute&typeAttr&=&tokenStream.getAttribute(TypeAttribute.class);
&&&&System.out.printf(&[%d:%d&%d]&%s/%s\n&,&offsetAtt.startOffset(),&offsetAtt.endOffset(),&positionAttr.getPositionIncrement(),&attribute,&typeAttr.type());
在另一些场景,支持以自定义的分词器(比如开启了命名实体识别的分词器、繁体中文分词器、CRF分词器等)构造HanLPTokenizer,比如:
tokenizer&=&new&HanLPTokenizer(HanLP.newSegment()
&&&&&&&&&&&&&&&&&&&&.enableJapaneseNameRecognize(true)
&&&&&&&&&&&&&&&&&&&&.enableIndexMode(true),&null,&false);
tokenizer.setReader(new&StringReader(&林志玲亮相网友:确定不是波多野结衣?&));
技术问题请&,大家一起讨论,也方便集中管理。博客留言、微博私信、邮件不受理任何HanLP相关的问题,谢谢合作!
反馈问题的时候请一定附上版本号、触发代码、输入输出,否则无法处理。
Apache License Version 2.0
分享到: ()
我的开源项目全文检索引擎Solr系列—–全文检索基本原理 - ImportNew
| 分类: ,
场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止。这种搜索方法叫做顺序扫描法。对于少量的数据,使用顺序扫描是够用的。但是妈妈叫你查出坑爹的“坑”字在哪一页时,你要是从第一页的第一个字逐个的扫描下去,那你真的是被坑了。此时你就需要用到索引。索引记录了“坑”字在哪一页,你只需在索引中找到“坑”字,然后找到对应的页码,答案就出来了。因为在索引中查找“坑”字是非常快的,因为你知道它的偏旁,因此也就可迅速定位到这个字。
那么新华字典的目录(索引表)是怎么编写而成的呢?首先对于新华字典这本书来说,除去目录后,这本书就是一堆没有结构的数据集。但是聪明的人类善于思考总结,发现每个字都会对应到一个页码,比如“坑”字就在第38页,“爹”字在第90页。于是他们就从中提取这些信息,构造成一个有结构的数据。类似数据库中的表结构:
---------------
这样就形成了一个完整的目录(索引库),查找的时候就非常方便了。对于全文检索也是类似的原理,它可以归结为两个过程:1.索引创建(Indexing)2. 搜索索引(Search)。那么索引到底是如何创建的呢?索引里面存放的又是什么东西呢?搜索的的时候又是如何去查找索引的呢?带着这一系列问题继续往下看。
Solr/Lucene采用的是一种反向索引,所谓反向索引:就是从关键字到文档的映射过程,保存这种映射这种信息的索引称为反向索引
左边保存的是字符串序列
右边是字符串的文档(Document)编号链表,称为倒排表(Posting List)
字段串列表和文档编号链表两者构成了一个字典。现在想搜索”lucene”,那么索引直接告诉我们,包含有”lucene”的文档有:2,3,10,35,92,而无需在整个文档库中逐个查找。如果是想搜既包含”lucene”又包含”solr”的文档,那么与之对应的两个倒排表去交集即可获得:3、10、35、92。
假设有如下两个原始文档:
文档一:Students should be allowed to go out with their friends, but not allowed to drink beer.
文档二:My friend Jerry went to school to see his students but found them drunk which is not allowed.
创建过程大概分为如下步骤:
一:把原始文档交给分词组件(Tokenizer)
分词组件(Tokenizer)会做以下几件事情(这个过程称为:Tokenize),处理得到的结果是词汇单元(Token)
将文档分成一个一个单独的单词
去除标点符号
去除停词(stop word)
所谓停词(Stop word)就是一种语言中没有具体含义,因而大多数情况下不会作为搜索的关键词,这样一来创建索引时能减少索引的大小。英语中停词(Stop word)如:”the”、”a”、”this”,中文有:”的,得”等。不同语种的分词组件(Tokenizer),都有自己的停词(stop word)集合。经过分词(Tokenizer)后得到的结果称为词汇单元(Token)。上例子中,便得到以下词汇单元(Token):
&Students&,&allowed&,&go&,&their&,&friends&,&allowed&,&drink&,&beer&,&My&,&friend&,&Jerry&,&went&,&school&,&see&,&his&,&students&,&found&,&them&,&drunk&,&allowed&
二:词汇单元(Token)传给语言处理组件(Linguistic Processor)
语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些语言相关的处理。对于英语,语言处理组件(Linguistic Processor)一般做以下几点:
变为小写(Lowercase)。
将单词缩减为词根形式,如”cars”到”car”等。这种操作称为:stemming。
将单词转变为词根形式,如”drove”到”drive”等。这种操作称为:lemmatization。
语言处理组件(linguistic processor)处理得到的结果称为词(Term),例子中经过语言处理后得到的词(Term)如下:
&student&,&allow&,&go&,&their&,&friend&,&allow&,&drink&,&beer&,&my&,&friend&,&jerry&,&go&,&school&,&see&,&his&,&student&,&find&,&them&,&drink&,&allow&。
经过语言处理后,搜索drive时drove也能被搜索出来。Stemming 和 lemmatization的异同:
相同之处:
Stemming和lemmatization都要使词汇成为词根形式。
两者的方式不同:
Stemming采用的是”缩减”的方式:”cars”到”car”,”driving”到”drive”。
Lemmatization采用的是”转变”的方式:”drove”到”drove”,”driving”到”drive”。
两者的算法不同:
Stemming主要是采取某种固定的算法来做这种缩减,如去除”s”,去除”ing”加”e”,将”ational”变为”ate”,将”tional”变为”tion”。
Lemmatization主要是采用事先约定的格式保存某种字典中。比如字典中有”driving”到”drive”,”drove”到”drive”,”am, is, are”到”be”的映射,做转变时,按照字典中约定的方式转换就可以了。
Stemming和lemmatization不是互斥关系,是有交集的,有的词利用这两种方式都能达到相同的转换。
三:得到的词(Term)传递给索引组件(Indexer)
利用得到的词(Term)创建一个字典
Document ID
对字典按字母顺序排序:
Document ID
合并相同的词(Term)成为文档倒排(Posting List)链表
Document Frequency:文档频次,表示多少文档出现过此词(Term)
Frequency:词频,表示某个文档中该词(Term)出现过几次
对词(Term) “allow”来讲,总共有两篇文档包含此词(Term),词(Term)后面的文档链表总共有两个,第一个表示包含”allow”的第一篇文档,即1号文档,此文档中,”allow”出现了2次,第二个表示包含”allow”的第二个文档,是2号文档,此文档中,”allow”出现了1次
至此索引创建完成,搜索”drive”时,”driving”,”drove”,”driven”也能够被搜到。因为在索引中,”driving”,”drove”,”driven”都会经过语言处理而变成”drive”,在搜索时,如果您输入”driving”,输入的查询语句同样经过分词组件和语言处理组件处理的步骤,变为查询”drive”,从而可以搜索到想要的文档。
搜索”microsoft job”,用户的目的是希望在微软找一份工作,如果搜出来的结果是:”Microsoft does a good job at software industry…”,这就与用户的期望偏离太远了。如何进行合理有效的搜索,搜索出用户最想要得结果呢?搜索主要有如下步骤:
一:对查询内容进行词法分析、语法分析、语言处理
词法分析:区分查询内容中单词和关键字,比如:english and janpan,”and”就是关键字,”english”和”janpan”是普通单词。
根据查询语法的语法规则形成一棵树
语言处理,和创建索引时处理方式是一样的。比如:leaned–&lean,driven–&drive
二:搜索索引,得到符合语法树的文档集合
三:根据查询语句与文档的相关性,对结果进行排序
我们把查询语句也看作是一个文档,对文档与文档之间的相关性(relevance)进行打分(scoring),分数高比较越相关,排名就越靠前。当然还可以人工影响打分,比如百度搜索,就不一定完全按照相关性来排名的。
如何评判文档之间的相关性?一个文档由多个(或者一个)词(Term)组成,比如:”solr”, “toturial”,不同的词可能重要性不一样,比如solr就比toturial重要,如果一个文档出现了10次toturial,但只出现了一次solr,而另一文档solr出现了4次,toturial出现一次,那么后者很有可能就是我们想要的搜的结果。这就引申出权重(Term weight)的概念。
权重表示该词在文档中的重要程度,越重要的词当然权重越高,因此在计算文档相关性时就更大。通过词之间的权重得到文档相关性的过程叫做空间向量模型算法(Vector Space Model)
影响一个词在文档中的重要性主要有两个方面:
Term Frequencey(tf),Term在此文档中出现的频率,ft越大表示越重要
Document Frequency(df),表示有多少文档中出现过这个Trem,df越大表示越不重要
物以希为贵,大家都有的东西,自然就不那么贵重了,只有你专有的东西表示这个东西很珍贵,权重的公式:
空间向量模型
文档中词的权重看作一个向量
Document = {term1, term2, …… ,term N}
Document Vector = {weight1, weight2, …… ,weight N}
把欲要查询的语句看作一个简单的文档,也用向量表示:
Query = {term1, term 2, …… , term N}
Query Vector = {weight1, weight2, …… , weight N}
把搜索出的文档向量及查询向量放入N维度的空间中,每个词表示一维:
夹角越小,表示越相似,相关性越大
关于作者:
程序员,关注 Java、Python、云计算,移动互联网。(新浪微博:)
我是没觉得你这样改让代码变得优雅了
花溪的小石头
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2017 ImportNew

我要回帖

更多关于 solr全文搜索 的文章

 

随机推荐