1 搜索的分类
1.1) 按照被搜索的资源类型
可以转为文本的: txt word ppt pdf
多媒体类型: 听歌识曲
1.2) 按照搜索的方式
处理语义:语音搜索
按照给定的文本来查找相关资源
2 全文检索
2.1) 以文本作为检索对象,找出含有检索对象的资源
2.2) 指标: 全面准确和快速
2.3) 特点: 只处理文本; 不处理语义; 搜索时英文不区分大小写; 结果列表有相关度排序
3 全文检索与数据库检索的对比
3.1) 匹配效果
数据库 like %pig% 数据集查询结果不精准
结果:pigeons(鸽子)
3.2) 查询结果是否按照相关度排序
打分机制,比如A文章出现关键词A1 100次 打分更高
3.3) 查询速度***
全文索引下, key(我是中国人) val(文章1,2)快递定位到目标位置
我是中国人
文章1 ******我是中国人
文章2 ******我是中国人*****
4 全文搜索的工具
Lucene
Java家族中最为出名的一个开源搜索引擎,在Java世界中已经是标准的全文检索程序,它提供了完整的查询引擎和索引引擎,没有中文分词引擎,需要自己去实现。
官方主页:http://lucene.apache.org/
solr
Solr是一个用java开发的独立的企业级搜索应用服务器,它提供了类似于Web-service的API接口,它是基于Lucene的全文检索服务器, 对外提供类似于Web-service的API接口,可以通过http请求进行操作。经常用于站内搜索,比如http://zookeeper.apache.org/中的搜索中的搜索。
官方主页:http://lucene.apache.org/solr/
Elasticsearch
Elasticsearch是一个采用java语言开发的,基于Lucene构造的开源,分布式的搜索引擎. 设计用于云计算中,能够达到实时搜索,稳定可靠. Elasticsearch的数据模型是JSON.
官方主页:http://www.elasticsearch.org/
5 solr 版本:
Solr ( Search On Lucene Replication)
Lucene Http(Servlet/REST) Schema.xml Solrconfig.xml
Solr1.x~3.x
SolrSingle Solr MutilCore
Solr4.x
SolrCloud = Solr+Zookeeper
6 solr特点:
通过HTTP协议处理搜索和查询请求。
增加了缓存,让响应速度更快。
提供了一个基于web的管理界面
查询结果分类(facet)
支持分布式,支持大规模的部署(solrcloud)(Solr4.0版本开始)
7 lucene架构图:
8 solr架构:
9 solr文档:
solr官方网站
http://lucene.apache.org/solr/
solr下载(v4.10.4)
http://archive.apache.org/dist/lucene/solr/4.10.4/
solr文档:
http://archive.apache.org/dist/lucene/solr/ref-guide/
http://lucene.apache.org/solr/4_10_0/tutorial.html
quickstart:
https://lucene.apache.org/solr/quickstart.html
solr下载地址: 如果想找solr的别的版本的,将后面数字替换成对应版本即可
http://apache.fayea.com/lucene/solr/5.5.0/
solr历史版本下载地址:
http://archive.apache.org/dist/lucene/solr/
http://apache.fayea.com/lucene/solr/
10 solr启动:
a) linux下 tar -zxvf solr-4.10.4.tgz
b) 进入solr/bin执行命令: 启动solr 以8984端口启动,默认是8983
[root@hadoop3 bin]# pwd
/opt/solr4/bin
[root@hadoop3 bin]# solr start -p 8984
如果指定了不同端口来启动solr后,打开不同浏览器访问:
别的端口访问下会报错如下:
sg=SolrCore 'collection1' is not available due to init failure: Index locked for write for core collection1,trace=org.apache.solr.common.SolrException: SolrCore 'collection1' is not available due to init failure: Index locked for write for core collection1
启动后访问链接: http://hadoop3:8984/solr 即可
如果启动不了,如下提示:
[root@hadoop3 bin]# solr start
Solr home directory /opt/solr4 must contain a solr.xml file!
表示找不到solr 家目录,需要用如下命令: -s 表示指定solr的家目录
[root@hadoop3 bin]# solr start -s /opt/solr/example/solr 启动
c) solr常用命令:
solr命令讲解(solr-4.10.4/bin/solr)
start, stop, restart, healthcheck
solr start -help
solr start [-f]:启动solr,默认后台运行
solr start -p <port>:指定solr实例端口
solr start -s <dir>:指定solr的solr.solr.home
solr start -d <dir>:指定solrweb项目根路径(项目根路径下必须有webapps/solr.war)
solr -p <port> -V:查看指定solr的运行基本信息
solr -i:查看有多少solr服务正在运行
solr stop -p <port>:停止运行在指定端口的solr服务
solr stop -all:停止所有solr服务
11 solr 部署在tomcat下
12 solr家目录:
solr解压文件名/example/solr,
collection1是索引库,其下的 /data是索引文件 /conf是配置文件
solr.solr.home指solr core的配置文件的根目录
Solr启动的时候会检查solr.solr.home的Java系统属性,如果没找到的话默认指定solr/目录
使用java -jar start 启动的时候可以通过下面方式指定
java -Dsolr.solr.home=solr/ -jar start.jar
使用solr start 命令启动,默认指定solr/目录,可以用过-s <path> 指定配置文件目录
使用tomcat启动则需要修改solr项目的web.xml文件或者添加JNDI文件(或者使用export命令定义solr.solr.home,仅适用于linux环境)
设置solr.solr.home的几种方式
http://myq526180048.iteye.com/blog/1664127
13 solr日志: solr解压目录/example/logs下
14: solr界面
solr上传数据三方式:
a) Documents方式:
b) solr-4.10.4\example\exampledocs 下 post.jar/simpleposttool.java 和 xxx.xml: 上传数据
[root@hadoop3 exampledocs]# pwd
/opt/solr/example/exampledocs
[root@hadoop3 exampledocs]# java -jar post.jar hd.xml
SimplePostTool version 1.5
Posting files to base url http://localhost:8983/solr/update using content-type application/xml..
POSTing file hd.xml
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/update..
Time spent: 0:00:00.192
c) solr-4.10.4\example\exampledocs 下 post.sh 方式上传:
[root@hadoop3 exampledocs]# post.sh money.xml
Posting file money.xml to http://localhost:8983/solr/update
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">8</int></lst>
</response>
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">17</int></lst>
</response>
15 solr schema:
solr-4.10.4\example\solr\collection1\conf\schema.xml :
indexed=true stored=true 是否索引 是否存储 required=true multivalued=多值
dynamicfield 动态字段 字段符合动态字段写法规范时就是动态字段定义的类型
copyfield: 文章= 标题+内容 --->
<copyField source="title" dest="text"/> 将 title和author里的内容合并到 text这个字段里 查询的时候如果在text这个字段中查到 就不需要再去title author每一个来匹配了
<copyField source="author" dest="text"/> 这样这篇文章就是我们关键词存在的文章了。
16 solr查询界面参数:
q: *:* ---> id:zm1 id:zm? 空格 or || 表示一个意思 或者
price:350 price:[300 TO 400] TO要大写 闭区间
fq: filter query
id:234 过滤id为234的 可以设置多次 多次后会获取这个交集
sort : 就是 order by
price asc/desc 后面必须带上升降序
fl: filter list 过滤只显示里面填写的字段 , 多字段下用 id,name这种方式写
df: default field 默认查询text这个字段, 如果在q查询条件中不写 name:zm 而是直接写成 zm,
solrconfig.xml中:定义 df为默认字段 text, 如果写id或者别的字段比如name 并且在q内没有指定列名而是列值zm , 就表示直接查询name=zm的数据
<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">text</str>
</lst>
wt: write type 写出去的类型,
hl: high ligth 高亮
facet: 分组
1. “:” 指定字段查指定值,如返回所有值*:*
2. “?” 表示单个任意字符的通配
3. “*” 表示多个任意字符的通配
4. “~” 表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
5. 邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
6. “^” 控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache
7. 布尔操作符AND、||
8. 布尔操作符OR、&&
9. 布尔操作符NOT、!、- (排除操作符不能单独与项使用构成查询)
10.“+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在
11. ( ) 用于构成子查询
12. [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]
13. {} 不包含范围检索,如检索某时间段记录,不包含头尾
date:{200707 TO 200710}
fq 值是一个查询,用于过滤查询结果,在负责查询时,可以很好的提高查询效率,fq 查询的内容会被缓存着,下次使用相同的过滤查询时,可以从缓存中命中。
使用 fq 参数时需要注意以下几点
在一个查询中,fq 参数可以设置多次。结果中将返回这些过滤条件的交集
过滤查询的结果将被分别缓存
使用filter query可以充分利用filter query cache,提高检索性能。
hl.fl:用空格或逗号隔开的字段列表
注意:要启用某个字段的高亮功能,需要保证这个字段在schema中是store。
hl.simple.pre:前缀
hl.simple.post:后缀
对于multiValued=true的字段不要设计高亮显示
因为solr对于这个字段里面的多个值只会返回匹配高亮的那个值
高亮时记得你的schema.xml文件中要配主键(<uniqueKey>id</uniqueKey>)
因为solr对高亮的设计是,高亮部分跟结果集部分是分开返回的,如果没有配主键,那么高亮部分就无法和结果集匹配,不能够确定高亮的是哪条记录的。
(类似于sql中的group by)
facet.query
price:[* TO 20]
price:[21 TO *]
在Raw Query Parameters中可以查询多个
facet=on&facet.query=price:[* TO 20]&facet.query=price:[21 TO *]
facet.field
根据某个字段进行分组统计
facet.prefix
表示Facet字段值的前缀.比如”facet.field=cpu&facet.prefix=Intel”,那么对cpu字段进行Facet查询,返回的cpu都是以”Intel”开头的,”AMD”开头的cpu型号将不会被统计在内
进入 more core.properties ====> 修改此文件 name=collection2 然后重启 这样就会有两个索引库