首先说下,查询都是基于solrj。如果不清楚solrj。可以当做是对solr查询语句的一个api封装。
solr的查询其实都是向select这个servlet穿字符型的参数,例如:
- http://192.168.1.107:8983/solr/collection1/select?q=*%3A*&wt=xml&indent=true
查询的字段格式一般是: 字段名: 字段值
说明号会被urlcoding,变成“%3A。”
我没有看过solrj的源码。但是应该是将对select这个servlet的请求通过httpclient的方式的一种实现。
进入正题:
首先需要实例化 SolrQuery 对象,用来做要查询的参数集合。
- SolrQuery q = new SolrQuery();
- q.setQuery("TITLE:中国人");
1、最基本的字段查询:
- TITLE:中国人
即查询 字段是TITLE 值包含“中国人”的所有结果集。
solr在查询时,会对传入的值分词, 中国人有可能会被分成“中国”,“国人”,“中国人”。
包含着三个短语的语句都会被搜到。强制要求solr不分词,可以给短语加上双引号
- TITLE:"中国人"
这样就只返回值包含“中国人”这个词语的。中国和 国人就不会返回。
2、多字段或关系 OR
- TITLE:("中国人" AND "美国人" AND "英国人")
3.多字段不包含的关系 NOT
这个语法就是我吃苦的地方,之前已经当多值or那样去查,结果不是,要写成
- TITLE:(* NOT "上网费用高" NOT "宽带收费不合理" )
4.查询一个范围 BETWEEN
- NUM:[-90 TO 360 ] OR CREATED_AT:[" + date1 + " TO " + date2 + "]
适用于数字和日期类型 .
日期转换上, date 要用
- String date1 = FastDateFormat.getInstance(
- "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(
- c.getStartTime().getTime())
来转换,而不是惯用的 yyyy-MM-dd HH:mm:ss
使全文检索查询数据经常要涉及到排序和条件查询,下面简单介绍常用的排序和查询方式。
SolrServer solr = SolrUtil.getSolrServer();
//获取查询对象
SolrQuery query = new SolrQuery();
//设置查询关键字
query.setQuery("content:程序员");
//设置查询返回的字段
query.setParam("fl", "createdAt,content");
//翻页设计参数:起始行,每行返回条数
query.setParam("start", "100");
query.setParam("rows", "10");
//字段排序
query.addSortField("createdAt", SolrQuery.ORDER.desc );
//时间条件查询
query.addFilterQuery("createdAt:[2011-01-01T00:00:01Z"+" TO 2013-01-01T00:00:01Z]");
//高亮显示
query.setHighlight(true).setHighlightSnippets(1);
需要注意,如果需要对field进行排序就必须在schema.xml中对该field进行配置格式如下:
<field name="createdAt" type="pdate" stored="true" indexed="true" multiValued="false" required="true"/>
其中 indexed="true表示运行被检索, multiValued="false" 不存在多值,默认为“true” 多值,多值无法排序。
高亮显示需要在solrconfig.xml中进行配置,修改为如下格式即可:
<formatter name="html"default="true"
class="solr.highlight.HtmlFormatter">
<lst name="defaults">
<str name="hl.simple.pre"><![CDATA[<font class='highlight'>]]></str>
<str name="hl.simple.post"><![CDATA[</font>]]></str>
</lst>
</formatter>