本文是延续 Solr的使用 系列,前一篇文章已经讲了 Solr 的部署和数据推送,这里主要以示例方式讲述 Solr 的常见查询语法,同时介绍如何使用 PHP 语言的客户端 solarium 同 Solr 集群进行数据交互。
想要详细地了解 Solr 查询语法,可参考 官方wiki 。
用于示例的数据,我已经推送到了 Solr , 见这里 。数据 Core 为 rooms,数据格式形如:
通过向 Solr 集群 GET 请求 /solr/core-name/select?query 形式的查询 API 完成查询,其中 core-name 为查询的 Core 名称。查询语句 query 由以下基本元素项组成,按使用频率先后排序:
wt 设置结果集格式,支持 json、xml、csv、php、ruby、pthyon,序列化的结果集,常使用 json 格式。
fl 指定返回的字段,多指使用“空格”和“,”号分割,但只支持设置了 stored=true 的字段。 * 表示返回全部字段,一般情况不需要返回文档的全部字段。
字段别名 :使用 displayName:fieldName 形式指定字段的别名,例如:
函数 :fl 还支持使用 Solr 内置函数 ,例如根据单价算总价:
fq 过滤查询条件,可充分利用 cache,所以可以利用 fq 提高检索性能。
sort 指定结果集的排序规则,格式为 <fieldName>+<sort>,支持 asc 和 desc 两种排序规则。例如按照价格倒序排列:
也可以多字段排序,价格和面积排序:
查询字符串 q 由以下元素项组成,字段条件形如 fieldName:value 格式:
以上元素项的默认值由 solrconfig.xml 配置文件定义。通常查询时设置 q=*:* ,然后通过 fq 过滤条件来完成查询,通过缓存提高查询性能。
Solr 的模糊查询使用占位符来描述查询规则,如下:
查询小区名称中包含“嘉”的房源信息:
Solr 的模糊查询为:
单精确值查询是最简单的查询,类似于 SQL 中 = *** 作符。查询小区 id 为 1111027377528 的房源信息:
Solr 中查询为:
多精确值查询是单精确值查询的扩展,格式为 (value1 value2 ...) ,功能类似于 SQL 的 IN *** 作符。查询小区 id 为 1111027377528 或者 1111047349969 的房源信息:
Solr 中查询为:
范围查询是查询指定范围的值(数字和时间),格式为 [value1 TO value2] ,类似于 SQL 的 BETWEEN *** 作符。查询价格在 [2000, 3000] 的房源信息:
Solr 中范围查询为:
几个特殊的范围查询:
将基本查询结合布尔查询,就可以实现大部分复杂的检索场景。布尔查询支持以下几种布尔 *** 作:
查询北京市价格区间在 [2000, 3000] 或者上海市价格区间在 [1500, 2000] 的房源信息:
转换为逻辑与布尔查询:
在实际中分组查询比较常见,当然 Solr 也支持分组查询。分组查询语句由以下基本元素项组成(常用部分):
查询西二旗内价格最便宜小区的房源信息:
Group 分组查询为:
结果为:
在大多数情况下,Group 分组已经能满足我们的需求,但是如果待分组字段为多值,Group 分组已经无能为力了,这时使用 Facet 就能轻松解决。
Solr 的 Facet 语句由以下基本元素构成(常用):
例如,统计每个商圈的房源分布情况并倒序排列,由于 bizcircleCode 字段为多值,Facet 查询为:
结果如下:
Solr 的 geofilt 过滤器可以实现 LBS 检索,但要在 schema.xml 配置中将需检索字段的字段类型设置为 solr.LatLonType 类型。geofilt 过滤器参数列表如下:
示例中的 location 字段,值为 “40.074203,116.315445”,类型配置为:
则检索坐标点 40.074203,116.315445 附近 2 公里的房源信息:
Solr 提供一些函数以实现逻辑或数学运算。其中常用 数学运算 函数列表如下:
常用的 逻辑运算 函数:
这些函数可以使用在返回值或者查询条件上。例如返回每个房源的每平方米价格信息:
PHP 可以使用 solarium 客户端,实现 Solr 数据源的检索,详细使用说明 见这里 。
solarium 客户端需要配置 Solr 的基本信息。如下:
solarium 提供的查询方法较丰富,整理后如下表所示:
查询北京市的所有房源信息,如下:
solarium 提供的分组查询方法如下表所示(常用):
获取西二旗每个小区的房源分布信息,如下:
solarium 提供的 Facet 查询方法,如下表(常用):
获取北京市每个商圈的房源分布信息,如下:
到这里,Solr 系列就整理完毕了,未涉及的部分后续接触时再补充。这两天利用休息时间充电,自己在 Solr 方面的技能也算是上了一个台阶了。
Solr 是一个可供企业使用的 基于 Lucene 的开箱即用的搜索服务器 对Lucene不熟?那么建议先看看下面两篇文档
实战Lucene 第 部分 初识 Lucene lo lucene /
用Lucene加速Web搜索应用程序的开发 lucene /
一 solr介绍
solr是基于Lucene Java搜索库的企业级全文搜索引擎 目前是apache的一个项目 它的官方网址在 solr需要运行在一个servlet 容器里 例如tomcat solr在lucene的上层提供了一个基于HTTP/XML的Web Services 我们的应用需要通过这个服务与solr进行交互
二 solr安装和配置
关于solr的安装和配置 这里也有两篇非常好的文档 作者同时也是 Lucene Java 项目的提交人和发言人
使用Apache Solr实现更加灵巧的搜索 solr /l
solr /l
下面主要说说需要注意的地方
Solr的安装非常简单 下载solr的zip包后解压缩将dist目录下的war文件改名为solr war直接复制到tomcat 的webapps目录即可 注意一定要设置solr的主位置 有三种方法 我采用的是在tomcat里配置java p/env/solr/home的一个JNDI指向solr的主目录(example目录下) 建立/tomcat /conf/Catalina/localhost/solr xml文件
<Context docBase= D:/solr war debug= crossContext= true ><Environment name= solr/home type= java lang String value= D:/solr/solr override= true /></Context>
观察这个指定的solr主位置 里面存在两个文件夹 conf和data 其中conf里存放了对solr而言最为重要的两个配置文件schema xml和solrconfig xml data则用于存放索引文件
schema xml主要包括types fields和其他的一些缺省设置
solrconfig xml用来配置Solr的一些系统属性 例如与索引和查询处理有关的一些常见的配置选项 以及缓存 扩展等等
上面的文档对这两个文件有比较详细的说明 非常容易上手 注意到schema xml里有一个
<uniqueKey>url</uniqueKey>
的配置 这里将url字段作为索引文档的唯一标识符 非常重要
三 加入中文分词
对全文检索而言 中文分词非常的重要 这里采用了qieqie庖丁分词(非常不错 )) 集成非常的容易 我下载的是 alpha 版本 其中它支持最多切分和按最大切分 创建自己的一个中文TokenizerFactory继承自solr的BaseTokenizerFactory
/** * Created by IntelliJ IDEA * User: ronghao * Date: * Time: : : * 中文切词 对庖丁切词的封装 */ public class ChineseTokenizerFactory extends BaseTokenizerFactory { /** * 最多切分 默认模式 */ public static final String MOST_WORDS_MODE = most words /** * 按最大切分 */ public static final String MAX_WORD_LENGTH_MODE = max word length private String mode = nullpublic void setMode(String mode) { if (mode==null||MOST_WORDS_MODE equalsIgnoreCase(mode) || default equalsIgnoreCase(mode)) { this mode=MOST_WORDS_MODE} else if (MAX_WORD_LENGTH_MODE equalsIgnoreCase(mode)) { this mode=MAX_WORD_LENGTH_MODE} else { throw new IllegalArgumentException( 不合法的分析器Mode 参数设置: + mode)} } @Override public void init(Map args) { super init(args)setMode(args get( mode ))} public TokenStream create(Reader input) { return new PaodingTokenizer(input PaodingMaker make() createTokenCollector())} private TokenCollector createTokenCollector() { if( MOST_WORDS_MODE equals(mode)) return new MostWordsTokenCollector()if( MAX_WORD_LENGTH_MODE equals(mode)) return new MaxWordLengthTokenCollector()throw new Error( never happened )} }
在schema xml的字段text配置里加入该分词器
<fieldtype name= text class= solr TextField positionIncrementGap= >
<*** yzer type= index >
<tokenizer class= ronghao fulltextsearch *** yzer ChineseTokenizerFactory mode= most words /> <filter class= solr StopFilterFactory ignoreCase= true words= stopwords txt />
<filter class= solr WordDelimiterFilterFactory generateWordParts= generateNumberParts= catenateWords= catenateNumbers= catenateAll= />
<filter class= solr LowerCaseFilterFactory />
<filter class= solr RemoveDuplicatesTokenFilterFactory />
</ *** yzer>
<*** yzer type= query >
<tokenizer class= ronghao fulltextsearch *** yzer ChineseTokenizerFactory mode= most words />
<filter class= solr SynonymFilterFactory synonyms= synonyms txt ignoreCase= true expand= true />
<filter class= solr StopFilterFactory ignoreCase= true words= stopwords txt />
<filter class= solr WordDelimiterFilterFactory generateWordParts= generateNumberParts= catenateWords= catenateNumbers= catenateAll= />
<filter class= solr LowerCaseFilterFactory />
<filter class= solr RemoveDuplicatesTokenFilterFactory />
</ *** yzer>
</fieldtype>
完成后重启tomcat 即可在
体验到庖丁的中文分词 注意要将paoding *** ysis jar复制到solr的lib下 注意修改jar包里字典的home
四 与自己应用进行集成
Solr安装完毕 现在可以将自己的应用与solr集成 其实过程非常的简单 应用增加数据——>根据配置的字段构建add的xml文档——>post至solr/update
应用删除数据à根据配置的索引文档唯一标识符构建delete的xml文档——>post至solr/update
检索数据à构建查询xml—>get至/solr/select/——>对solr返回的xml进行处理——>页面展现
具体的xml格式可以在solr网站找到 另外就是solr支持高亮显示 非常方便
关于中文 solr内核支持UTF 编码 所以在tomcat里的server xml需要进行配置
<Connector port= maxHttpHeaderSize= URIEncoding= UTF …/>
另外 向solr Post请求的时候需要转为utf 编码 对solr 返回的查询结果也需要进行一次utf 的转码 检索数据时对查询的关键字也需要转码 然后用 + 连接
String[] array = StringUtils split(query null )for (String str : array) { result = result + URLEncoder encode(str UTF ) + + }
lishixinzhi/Article/program/Java/hx/201311/25984
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)