Apache Solr (读音: Soler) 是一个开源的搜索服务器。
Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。
Apache Solr 中存储的资源是以 Document 为对象进行存储的。
每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。
Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,
在 Schema 配置文件中使用:<uniqueKey>id</uniqueKey>进行描述。
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。
文档通过Http利用XML加到一个搜索集合中。
查询该集合也是通过 http收到一个XML/JSON响应来实现。
它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
solrconfig.xml schema.xml
solr 查询参数说明备忘
常用:
q - 查询字符串,必须的。
fl - 指定返回那些字段内容,用逗号或空格分隔多个。
start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
rows - 指定返回结果最多有多少条记录,配合start来实现分页。
sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。
wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。官方文档:http://wiki.apache.org/solr/CommonQueryParameters#head-6522ef80f22d0e50d2f12ec487758577506d6002
不常用:
q.op - 覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定
df - 默认的查询字段,一般默认指定
qt - (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。
其它
indent - 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。
version - 查询语法的版本,建议不使用它,由服务器指定默认值。
[Solr的检索运算符]
“:” 指定字段查指定值,如返回所有值*:*
“?”表示单个任意字符的通配
“*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)
“~”表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
“^”控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache
布尔操作符AND、||
布尔操作符OR、&&
布尔操作符NOT、!、-(排除操作符不能单独与项使用构成查询)
“+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在
( ) 用于构成子查询
[] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]
{}不包含范围检索,如检索某时间段记录,不包含头尾
date:{200707 TO 200710}
" 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : "
1.Jetty1.6+Solr4.4+mmseg4j(搜狗分词)
2.文件目录结构:bin(启动shell目录),etc(Daogou Solr 配置文件),tmp(daogou solr运行临时文件夹)
webapps(Jetty服务器启动class文件),solr(solr主目录文件),data(索引文件以及词库目录),logs(daogou solr 运行日志目录),solr应用文件(solr/webapps/solr.war)
resource(应用服务静态文件),lib(应用服务jar包库文件)
3.Solr MultiCore配置说明:
1.solr/solr.xml配置文件
<solr persistent="false">
<cores adminPath="/admin/cores">
<core name="solr365" instanceDir="solr365" />
<core name="solr_XXX" instanceDir="solrXXX" />(选项)
</cores>
</solr>
2.拷贝solr/solr365目录,修改这个目录下面相关配置(schema.xml,solrconfig.xml)
3.新core目录创建完成后要确保相关配置是否和原来不一样后,才可以在最外面bin/bootstrap.sh start|stop|restart启动应用
4.core 索引目录(data/corename/index)
参考学习网站:
http://lucene.apache.org/solr
http://jetty.codehaus.org/jetty/
http://www.oschina.net/p/jetty
http://code.google.com/p/mmseg4j/
http://blog.chenlb.com/category/mmseg4j/
http://docs.oracle.com/javaee/5/api/javax/servlet/package-summary.html
http://robotlibrarian.billdueber.com/an-exercise-in-solr-and-dataimporthandler-hathitrust-data/
缓存配置solrconfig.xml
filterCache 缓存
filterCache:当搜索请求参数中带有参数"ids"时,Solr会去filterCache里查,filterCache里Key是query,值是DocSet,,也就是无序的Document id,如果有多个ids里包含多个id,则用分隔符“,”分开。如果filterCache中没有对应的值,则通过reader都查找对应的DocSet,并添加到filterCache缓存中。
<filterCache class="solr.FastLRUCache"
size="10240"
initialSize="8092"
autowarmCount="4096"/>
queryResultCache 缓存
如果搜索请求参数没有ids参数时,则会不去filterCache缓存里找,而且没有Filter时,才是去queryResultCache里查找,queryResultCache里保存的是有序的DocList。在查到docList后,回去取docSet,即会在filterCache中查,没有的话会加到filterCache中,如果queryResultCache缓存中没有值,也先去取docSet,即通过filterCache,没有对应的值的话,则重新构建,添加到缓存中,则通过一般的查找方式找到。然后添加到queryResultCache缓存中。
<queryResultCache class="solr.LRUCache"
size="1024"
initialSize="1024"
autowarmCount="512"/>
documentCache 缓存
documentCache 是在通过doc(int i) 方法取document时,用到的。 documentCache 不存在的话,这通过reader去取,取到document后,添加到documentCache 缓存。
<documentCache class="solr.LRUCache"
size="10240"
initialSize="8092"
autowarmCount="4096"/>
fieldValueCache 缓存
fieldValueCache 缓存是在solr组件FacetComponent组件里发货作用的。条件是如果要统计的Field是multiValued,也就是有多个值的情况,solr 会根据field创建一个field反正类UnInvertedField,通过注解大概了解是节约内存和加速facet统计。
<fieldValueCache class="solr.FastLRUCache"
size="512"
autowarmCount="128"
showItems="32" />
httpCache 缓存
Solr httpCache 主要是用来判断当前的搜索请求request的请求头header的If-Modified-Since和If-None-Match的两个值。
文章评论