Solr环境搭建(引用)
总结别人博客,留给最好的自己。
想要使用solr那么首先我们得安装它
1:安装 Tomcat,解压缩即可。
2:解压 solr,官网 http://lucene.apache.org/solr/
3:把 solr 下的dist目录solr-4.10.3.war(我用的是这个版本)部署到 Tomcat\webapps下(去掉版本号)。
4:解压缩 war 包,可以启动 Tomcat解压,可以用压缩软件解压 --【直接粘贴到Tomcat\webapps下,解压后删除war文件(不删的话,重启tomcat时默认会覆盖你的修改)】
5:把solr下example/lib/ext 目录下的所有的 jar 包,添加到 solr(Tomcat\webapps\solr) 的工程中(\WEB-INF\lib目录下)。
6:创建一个 solrhome 。solr 下的/example/solr 目录就是一个 solrhome。复制此目录到某个盘改名为solrhome
7:关联 solr 及 solrhome。需要修改 solr 工程的 web.xml 文件。
8:启动 Tomcat,看到下面这个界面说明solr安装成功啦
http://IP:8080/solr/
Solr服务器配置中文分词器
但是由于这个东西是外国人写的,再加上博大精深的中华文化,solr对于中文的分词效果非常糟糕,不能很好的分词,就不能建立一个很好的索引库,也就不能提供好的搜索服务.于是我们中国人基于solr自己写了个分词器,终于能够愉快的使用solr了;
而当我们使用了中文分词器后效果变成这样
下面我们就来说说怎样使用这个中午让你分词器吧(当然有多种啦,目前最受欢迎的就是IK Analyzer 啦)
介绍:
IK Analyzer 是一个开源的,基亍 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立亍 Lucene 项目,同时提供了对 Lucene 的默认优化实现。在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。
使用步骤:
1、下载IKAnalyzer,解压后把IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目录下
官网:http://code.google.com/p/ik-analyzer/downloads/list,打不开就到网上找一个
2、创建WEB-INF/classes文件夹 把扩展词典、停用词词典、配置文件放到 solr 工程的 WEB-INF/classes 目录下。
ext.dic的内容,比如如下:
高富帅
黑马程序员
二维表
这样的话,碰到这样的词就不会进行拆分了,所以,一些网络新词就可以在这里进行配置。
IKAnalyer.cfg.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
stopwords.dic内容:
我
是
的
a
an
and
are
as
这样的话,对于上面的字就不会进行显示处理了,因为这些都是没有意义的词汇。
3、修改 Solrhome 的 schema.xml 文件,配置一个 FieldType,使用 IKAnalyzer
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
重启tomcat,如图提示操作,看到下面的效果说明成功

————————————————
配置solr服务器导入数据库数据
(1)导包
首先是需要在solr的核心库中添加一些导入数据的包,需要如下:
注意:因为在collection中,最初是没有lib这个文件目录的,所以需要自己创建一个lib目录,然后把相应的jar包添加进去。
(2)在collection中的config目录下的solrconfig.xml中添加数据导入处理器
<requestHandler name="/dataimport"
class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
3)在collection中的config目录添加一个data-config.xml(这个与上面一步配置的名字要相同)
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/需要导入数据的数据库名"
user="数据库账号"
password="数据库密码"/>
<document>
<entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products">
<field column="pid" name="id" />
<field column="name" name="product_name" />
<field column="catalog_name" name="product_catalog_name" />
<field column="price" name="product_price" />
<field column="description" name="product_description" />
<field column="picture" name="product_picture" />
</entity>
</document>
</dataConfig>
(4)在collection中config目录下的schema.xml添加如下内容
保留 <field name="_version_" type="long" indexed="true" stored="true"/>和<field name="_root_" type="string" indexed="true" stored="false"/>
<uniqueKey>product_name</uniqueKey> 字段改成自己的,我的数据库唯一值是 product_name。
把 dynamicField 也都删除掉 ,把 <uniqueKey>id</uniqueKey> 删除掉。
其余的 field 删除掉,并修改成自己的内容,如下:
<!--配置从数据库导入到sorl中的数据的字段内容,所以每次要从数据库导入什么就需要配置什么-->
<field name="product_name" type="text_ik" indexed="true" stored="true"/>
<field name="product_price" type="float" indexed="true" stored="true"/>
<field name="product_description" type="text_ik" indexed="true" stored="false"/>
<field name="product_picture" type="string" indexed="false" stored="true"/>
<field name="product_catalog_name" type="string" indexed="true" stored="true"/>
<field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true" />
1.重启tomcat 访问 http://localhost:8080/solr 会出现管理界面
2.点击页面左侧的 Core Admin,在右侧 name: 和 instanceDir: 输入 myProject,点击 Add Core,创建成功。
3.下面来导入数据,在左侧 Core Selector,选择myProject, 然后点击下面DataImport,点击右侧Execute,导入完成会提示类似下面的信息
Last Update: 11:38:41
Indexing completed. Added/Updated: 787 documents. Deleted 0 documents. (Duration: 03s)
Requests: 1 (0/s), Fetched: 787 (262/s), Skipped: 0, Processed: 787 (262/s)
Started: less than a minute ago4.进入查询界面,试试看能不能检索出结果,点击页面右下角的 Query,q 输入框*:*不用修改,直接点击 Execute Query,如果没问题的话
右侧应该会出现检索结果
查询命令的基本使用
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}
Java中使用SolrJ
1.添加依赖
2.创建java实体类封装数据,封装了和配置文件中配置的业务字段相对应的字段的一个实体对象
public class Entity{
@Field(value = "id")
private String id;@Field(value = "name")
private String name;@Field(value = "description")
private String description;}
接下来就是具体操作solr的代码,实际项目中可根据需要对操作solr的增删改查的方法做进一步的封装,新建SolrUtil工具类
- public class SolrUtil {
- //solr服务器所在的地址,core0为自己创建的文档库目录
- private final static String SOLR_URL = "http://192.168.111.130:8080/solr/core0";
- /**
- * 获取客户端的连接
- *
- * @return
- */
- public HttpSolrClient createSolrServer() {
- HttpSolrClient solr = null;
- solr = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();
- return solr;
- }
- /**
- * 往索引库添加文档
- *
- * @throws SolrServerException
- * @throws IOException
- */
- public void addDoc() throws SolrServerException, IOException {
- SolrInputDocument document = new SolrInputDocument();
- document.addField("id", "7");
- document.addField("name", "钢铁侠");
- document.addField("description", "一个逗比的码农");
- HttpSolrClient solr = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000)
- .withSocketTimeout(60000).build();
- solr.add(document);
- solr.commit();
- solr.close();
- System.out.println("添加成功");
- }
- /**
- * 根据ID从索引库删除文档
- *
- * @throws SolrServerException
- * @throws IOException
- */
- public void deleteDocumentById() throws SolrServerException, IOException {
- HttpSolrClient server = new HttpSolrClient.Builder(SOLR_URL)
- .withConnectionTimeout(10000)
- .withSocketTimeout(60000).build();
- server.deleteById("6");
- server.commit();
- server.close();
- }
- /**
- * 根据设定的查询条件进行文档字段的查询
- * @throws Exception
- */
- public void querySolr() throws Exception {
- HttpSolrClient server = new HttpSolrClient.Builder(SOLR_URL)
- .withConnectionTimeout(10000)
- .withSocketTimeout(60000).build();
- SolrQuery query = new SolrQuery();
- //下面设置solr查询参数
- //query.set("q", "*:*");// 参数q 查询所有
- query.set("q", "钢铁侠");//相关查询,比如某条数据某个字段含有周、星、驰三个字 将会查询出来 ,这个作用适用于联想查询
- //参数fq, 给query增加过滤查询条件
- query.addFacetQuery("id:[0 TO 9]");
- query.addFilterQuery("description:一个逗比的码农");
- //参数df,给query设置默认搜索域,从哪个字段上查找
- query.set("df", "name");
- //参数sort,设置返回结果的排序规则
- query.setSort("id",SolrQuery.ORDER.desc);
- //设置分页参数
- query.setStart(0);
- query.setRows(10);
- //设置高亮显示以及结果的样式
- query.setHighlight(true);
- query.addHighlightField("name");
- query.setHighlightSimplePre("<font color='red'>");
- query.setHighlightSimplePost("</font>");
- //执行查询
- QueryResponse response = server.query(query);
- //获取返回结果
- SolrDocumentList resultList = response.getResults();
- for(SolrDocument document: resultList){
- System.out.println("id:"+document.get("id")+" document:"+document.get("name")+" description:"+document.get("description"));
- }
- //获取实体对象形式
- List<Person> persons = response.getBeans(Person.class);
- System.out.println(persons.get(0).getName());
- }
- public static void main(String[] args) throws Exception {
- SolrUtil solr = new SolrUtil();
- //solr.addDoc();
- solr.querySolr();
- }
- }