solr学习笔记(一)
来源:互联网 发布:阿里云域名注册查询 编辑:程序博客网 时间:2024/06/03 12:16
Solr学习使用笔记(一)
一,Solr的目录结构
将下载的zip包解压到不含中文的目录即可使用,此处需要介绍一下Solr的目录结构,也就是初学者应该知道的几个地方.
首先在第一层目录中需要知道的是contrib和dist,这两个文件夹里面存放的是solr所要依赖的jar包,例如后面solr的数据库数据导入所需要的jar包就是需要拷贝到此处.再一个重要的文件件就是example文件夹.这里面存放的是solr的运行案例和内置的jetty服务器.Solr就是一个web服务.
进入example文件夹
需要注意的几点一是solr文件夹,里面存放的是索引库和配置信息,solr-webapp和webapps里面存放的solr.war,也就是solr服务,最后一个需要注意的地方就是start.jar,这个文件是用来运行jetty容器的.
二,启动jetty服务器,发布solr服务
在cmd中执行Java -jar start.jar 启动jetty服务器,并且访问
http://localhost:8983/solr/#/
三:将服务发布到Tomcat容器中
1,将webapps中的solr.war拷贝到tomacat中的webapps中
2,解压并添加solr需要的依赖包,此处主要需要的是ik分词器的包,日志包
3, 修改Tomcat配置文件,指向Solr的索引库及配置目录。
在bin文件夹中的catalina.bat的开头添加
set "JAVA_OPTS"=-Dsolr.solr.home="路径"
,
4,启动tomcat,双击bin文件夹中的startup.bat
启动闪退,原因是删了之前的项目,但是,没有在server.xml中去除残留项目信息,打开server.xml,
<ContextdocBase="D:\Software\apache-tomcat-7.0.52\webapps\CRM"path="/CRM" reloadable="true"source="org.eclipse.jst.jee.server:CRM"/>删除这段context包含的内容.
启动报错,发现solr的路径配错.斜杠写反了
org.apache.solr.common.SolrException: Could not load conf for core collection1: Error loading solr config from d:/solr\collection1\conf\solrconfig.xml
再次报错发现8009端口被占用
<!--Define an AJP 1.3 Connector on port 8009 -->
<Connector port="9009" protocol="AJP/1.3"redirectPort="8443"/>
再次启动
成功,访问http://localhost:80/solr/#/成功
四,Core目录介绍
Solr中core指的是每一个索引库,就像mysql中的每一个数据库,在solr的自带的core,collection1下存在一个conf文件夹和data文件夹,,在conf中主要存放的是配置信息,data存储的是索引的数据.conf配置中需要了解的是约束配置文件schema.xml和索引配置文件solrconfig.xml.
先从collection1中拷贝多一个索引库命名为coreTest,进行配置文件等的修改.
1,在core.properties文件中需要更改内容,是名称和文件夹名和里面的name一致
name=coreTest
2,更改约束文件schema.xml
Schema.xml(注释在文档中)
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
<!-- field标签中包的是索引库中的字段version和root是自带的不可删除-->
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="_root_" type="string" indexed="true" stored="false"/>
<!-- 这里是可以自定义的字段,name是名称type是配置文件中所定义的类型,stored是是否存储,required表示是否必须,multiValued表示值是否多个-->
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="price" type="long" indexed="true" stored="true"/>
<field name="text" type="text_general" indexed="true" stored="false" multiValued="false"/>
<!--这里是动态字段,即匹配符字段,由于solr中未定义的字段不可存储,所以在此处扩展动态字段,使得可存储的字段更多-->
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
<!--uniqueKey指定唯一标识-->
<uniqueKey>id</uniqueKey>
<!--fieldType是定义字段类型-->
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
<!--定义复杂的字段类型,添加中文ik类型,并且需要在lib中引入jar包-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer">
</fieldType>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
</schema>
ik中文分词器的jar包是存放在Tomcat中部署的solr项目中的lib中
solrconfig.xml
这个配置文件主要用于优化索引库的,处理请求等.
<lib dir="../contrib/extraction/lib" regex=".*\.jar" />
<lib dir="../dist/" regex="solr-cell-\d.*\.jar" />
<lib dir="../contrib/clustering/lib/" regex=".*\.jar" />
<lib dir="../dist/" regex="solr-clustering-\d.*\.jar" />
<lib dir="../contrib/langid/lib/" regex=".*\.jar" />
<lib dir="../dist/" regex="solr-langid-\d.*\.jar" />
<lib dir="../contrib/velocity/lib" regex=".*\.jar" />
<lib dir="../dist/" regex="solr-velocity-\d.*\.jar" />
上述是用来查找solr依赖包,扩展插件包,需要找到放置的lib包的constrib和dist文件夹,或者更改路径或者拷贝到正确路径.
<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">text</str>
</lst>
</requestHandler>
标签用来定义处理请求的,这个例子处理的是查询所有.
五:solr数据库导入数据插件安装
第一步:solrconfig.xml,添加导入数据的插件:
<lib dir="../dist/" regex="solr-dataimporthandler-\d.*\.jar" />
<!--配置importhandler-->
<requestHandler name="/import" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xml</str>
</lst>
</requestHandler>
第二步添加配置文件db-data-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solrtest"
user="root"
password="simplehxb"/>
<document>
<entity name="item" query="select id,title,price from items">
<field column="id" name="id"/>
<field column="title" name="text"/>
<field column="price" name="price"/>
</entity>
</document>
</dataConfig>
第三步:将jar包拷贝到部署在tomacat的solr项目的lib包中
启动Tomact,如果id不是string类型需要在solrconfig.xml中这一段配置
<searchComponent name="elevator" class="solr.QueryElevationComponent" >
<!-- pick a fieldType to analyze queries -->
<str name="queryFieldType">string</str>
<str name="config-file">elevate.xml</str>
</searchComponent>
六,solrJ的使用
创建maven项目并且管理依赖
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.2</version>
</dependency>
<!-- Solr底层会使用到slf4j日志系统 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.22</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
Creat
编写测试类,测试直接添加文档
@Test
public void testSolrCreat() throws Exception{
HttpSolrServer httpSolrServer = new HttpSolrServer("http://127.0.0.1/solr/coreTest");
//加入document
SolrInputDocument solrDocument = new SolrInputDocument();
//向文档中添加字段
solrDocument.addField("id", 15L);
solrDocument.addField("price", 150000L);
solrDocument.addField("text", "努比亚 智能机 超长待机 能砸核桃");
//添加文档
httpSolrServer.add(solrDocument);
//提交
httpSolrServer.commit();
}
但是一般而言,我们在实际的开发中这种直接添加文档的方式显然是不可取的,从数据库查出数据会被框架直接封装成bean,同样solr提供了直接添加bean的方式创建方式,并且可以添加bean的集合方式.
@Test
public void testSolrCreatByBean() throws Exception{
//连接到索引库
HttpSolrServer httpSolrServer = new HttpSolrServer("http://127.0.0.1/solr/coreTest/");
//创建bean
Item item = new Item(16L, 200000L, "一加 玫瑰金 超大内存");
httpSolrServer.addBean(item);
//提交
httpSolrServer.commit();
}
Delete
@Test
public void testSolrDelete() throws Exception, IOException{
HttpSolrServer httpSolrServer = new HttpSolrServer("http://127.0.0.1/solr/coreTest/");
//根据id删除
httpSolrServer.deleteById("16");
httpSolrServer.commit();
}
之所以说solr可怕是在于它的查询方式,同时删除也可以根据查询来删除,此处可以直接参考api,下面介绍强大的solrj的查询
Retrieve
以Document形式返回查询的结果
@Test
public void testSolrRetrieveByDocument() throws Exception{
//连接索引库
HttpSolrServer httpSolrServer = new HttpSolrServer("http://127.0.0.1/solr/coreTest/");
//创建查询条件
SolrQuery query = new SolrQuery("text:手机");
//接受返回结果
QueryResponse response = httpSolrServer.query(query);
//拿到文档集合
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("共查到"+solrDocumentList.size()+"条数据");
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println("id:"+solrDocument.get("id"));
System.out.println("price:"+solrDocument.get("price"));
System.out.println("text:"+solrDocument.get("text"));
}
}
同样以bean形式返回方式
@Test
public void testSolrRetrieveByBean() throws Exception{
//连接索引库
HttpSolrServer httpSolrServer = new HttpSolrServer("http://127.0.0.1/solr/coreTest/");
//创建查询条件
SolrQuery query = new SolrQuery("text:手机");
//接受返回结果
QueryResponse response = httpSolrServer.query(query);
//拿到文档集合
List<Item> items = response.getBeans(Item.class);
for (Item item : items) {
System.out.println(item);
}
}
总结:
SolrQuery对象的高级查询
在创建SolrQuery时,我们填写的Query语句,可以有以下高级写法:
查询语句中如果有特殊字符,需要转义,可以使用:””
1、匹配所有文档:*:* (通配符?和*:“*”表示匹配任意字符;“?”表示匹配出现的位置)
2、布尔操作:AND、OR和NOT布尔操作(推荐使用大写,区分普通字段)
3、子表达式查询(子查询):可以使用“()”构造子查询。 比如:(query1 AND query2) OR (query3AND query4)
4、相似度查询:
(1)默认相似度查询:title:appla~ ,此时编辑举例是2
(2)指定编辑举例的相似度查询:对模糊查询可以设置编辑举例,可选0~2的整数。
5、范围查询(Range Query):Lucene支持对数字、日期甚至文本的范围查询。结束的范围可以使用“*”通配符。
(1)日期范围(ISO-8601 时间GMT):a_begin_date:[1990-01-01T00:00:00Z TO 1999-12-31T24:59:99Z]
(2)数字:salary:[2000 TO *]
(3)文本:entryNm:[a TO a]
6、日期匹配:YEAR, MONTH, DAY, DATE (synonymous with DAY) HOUR, MINUTE, SECOND, MILLISECOND, and MILLI (synonymous with MILLISECOND)可以被标志成日期。
(1)r_event_date:[* TO NOW-2YEAR]:2年前的现在这个时间
(2)r_event_date:[* TO NOW/DAY-2YEAR]:2年前前一天的这个时间
- solr学习笔记(一)
- Solr学习笔记(一)Solr的安装
- solr学习笔记(一):入门
- Lucene/Solr学习笔记(一)
- Solr学习笔记一 ---Solr运行环境搭建(tomcat7 + solr 3.5 +ubuntu 10.04)
- solr笔记一
- Solr笔记(一)
- Solr学习(一)
- Solr笔记一 之Solr介绍
- Solr学习笔记
- Nutch+Solr学习笔记
- solr学习笔记
- solr学习笔记
- solr学习笔记
- solr学习笔记-入门
- 搜索-Solr学习笔记
- solr 学习笔记
- solr学习笔记
- 笔试笔记(十)
- 关于为什么在手机的文件管理中看到的文件夹,而在电脑的打开设备查看文件中却看不到
- El表达式与JSTL表达式
- ACM周中训练笔记—8月31日
- 二叉查找树
- solr学习笔记(一)
- muduo tcp服务端日志分析
- javascript实现链表结构
- 集合day1
- thread的常用方法
- 游标(cursor)、函数(function)、存储过程(procedure)
- [编程题] 堆砖
- MySql与数据库的简单介绍
- [cvpr2017]Domain Adaptation by Mixture of Alignments of Second- or Higher-Order Scatter Tensors