Solr是一款开源的全文检索引擎,基于lucene。拥有完善的可配置功能界面。具备丰富的查询语言,可扩展,可优化。php
进入solr官网下载包(这里我使用的版本是8.0)java
http://www.apache.org/dyn/closer.lua/lucene/solr/8.0.0git
命令行进入solr的bin目录,提示Started Solr server on port 8983. Happy searching!即成功启动服务。github
solr start -p 端口号 启动服务web
solr restart -p 端口号 重启服务sql
solr stop -p 端口号 关闭服务数据库
solr create -c name 建立一个core实例apache
Solr全部操做在Core中进行,因此使用Solr以前需先建立Core实例,Solr服务可建立多个Core实例。json
两种方式建立Core实例,建立Core实例将在solr目录下server/solr生成对应目录。安全
Schema配置将告诉solr服务如何创建索引,它的配置围绕core目录下conf/managed-schema文件,该文件指定每一个字段类型,分词方式。
可经过手动编辑或者使用schemaAPI进行配置(推荐使用schemaAPI,可不须要从新加载Core或重启Solr服务,方便维护),不推荐使用手动编辑的方式(可能形成数据丢失)。
Solr虽然自带的中文分词器,但不能自定义中文词库,扩展性较差。这里咱们使用IK分词器,这是一个第三方的分词器,能够很好的扩展中文词库。
github地址(含配置方法/使用教程):https://github.com/magese/ik-analyzer-solr
可在AdminUI中Analysis中测试分词效果
DIH全称是Data Import Handler 数据导入处理器,做用是将数据导入到Solr中,而数据存储在xml,pdf或关系型数据库中。solr首先须要获取这些数据,而后在数据中创建索引达到快速搜索的目的。
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">db-data-config.xml</str> </lst> </requestHandler>
<dataConfig> <dataSource driver="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/test" user="postgres" password="123456"/> <document> <entity name="sw2015_p11shangyedasha" query="select id,name,address,ST_AsText(geom) as geom from sw2015_p11shangyedasha"> <field column="id" name="id"></field> <field column="name" name="name"></field> <field column="address" name="address"></field> <field column="geom" name="geom"></field> </entity> </document> </dataConfig>
q 查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,
fl 指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort
start 返回结果的第几条记录开始,通常分页用,默认0开始
rows 指定返回结果最多有多少条记录,默认值为 10,配合start实现分页
sort 排序方式,例如id desc 表示按照 “id” 降序
wt (writer type)指定输出格式,有 xml, json, php等
fq (filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,而且sort是1到5之间的。
df 默认的查询字段,通常默认指定。
qt (query type)指定那个类型来处理查询请求,通常不用指定,默认是standard。
indent 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,通常调试json,php,phps,ruby输出才有必要用这个参数。
version 查询语法的版本,建议不使用它,由服务器指定默认值。
“:” 指定字段查指定值,如返回全部值*:*
“?” 表示单个任意字符的通配
“*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)
“~” 表示模糊检索,如检索拼写相似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回类似度在0.8以上的记录。
AND、|| 布尔操做符
OR、&& 布尔操做符
NOT、!、-(排除操做符不能单独与项使用构成查询)
“+” 存在操做符,要求符号”+”后的项必须在文档相应的域中存在²
( ) 用于构成子查询
[] 包含范围检索,如检索某时间段记录,包含头尾,date:[201507 TO 201510]
{} 不包含范围检索,如检索某时间段记录,不包含头尾date:{201507 TO 201510}
maven引入solrj,solrj是java访问Solr的客户端工具包。
<!-- Solr --> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>8.0.0</version> </dependency>
SolrUtil.java
package com.bret.gis.utils; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocumentList; public class SolrUtil { //指定solr服务器的地址 private final static String SOLR_URL = "http://localhost:8983/solr/"; /** * 建立SolrServer对象 * * 该对象有两个可使用,都是线程安全的 * 一、CommonsHttpSolrServer:启动web服务器使用的,经过http请求的 * 二、 EmbeddedSolrServer:内嵌式的,导入solr的jar包就可使用了 * 三、solr 4.0以后好像添加了很多东西,其中CommonsHttpSolrServer这个类更名为HttpSolrClient * * @return */ public HttpSolrClient createSolrServer(){ HttpSolrClient solr = null; solr = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build(); return solr; } /** * 查询 * @throws Exception */ public SolrDocumentList querySolr(String q,int start,int rows) throws Exception{ HttpSolrClient solrServer = new HttpSolrClient.Builder(SOLR_URL + "tianjing/").withConnectionTimeout(10000).withSocketTimeout(60000).build(); SolrQuery query = new SolrQuery(); //下面设置solr查询参数 //query.set("q", "*:*");// 参数q 查询全部 query.set("q",q);//相关查询,好比某条数据某个字段含有周、星、驰三个字 将会查询出来 ,这个做用适用于联想查询 //参数fq, 给query增长过滤查询条件 query.addFilterQuery("id:[0 TO 9]");//id为0-4 //给query增长布尔过滤条件 //query.addFilterQuery("description:演员"); //description字段中含有“演员”两字的数据 //参数df,给query设置默认搜索域 query.set("df", "name"); //参数sort,设置返回结果的排序规则 query.setSort("id",SolrQuery.ORDER.desc); //设置分页参数 query.setStart(start); query.setRows(rows);//每一页多少值 //参数hl,设置高亮 query.setHighlight(true); //设置高亮的字段 query.addHighlightField("name"); //设置高亮的样式 query.setHighlightSimplePre("<font color='red'>"); query.setHighlightSimplePost("</font>"); //获取查询结果 QueryResponse response = solrServer.query(query); //两种结果获取:获得文档集合或者实体对象 //查询获得文档的集合 SolrDocumentList solrDocumentList = response.getResults(); System.out.println("经过文档集合获取查询的结果"); System.out.println("查询结果的总数量:" + solrDocumentList.getNumFound()); //遍历列表 /*for (SolrDocument doc : solrDocumentList) { System.out.println("id:"+doc.get("id")+" name:"+doc.get("name")+" description:"+doc.get("description")); }*/ //获得实体对象 /*List<Person> tmpLists = response.getBeans(Person.class); if(tmpLists!=null && tmpLists.size()>0){ System.out.println("经过文档集合获取查询的结果"); for(Person per:tmpLists){ System.out.println("id:"+per.getId()+" name:"+per.getName()+" description:"+per.getDescription()); } }*/ return solrDocumentList; } }