四时宝库

程序员的知识宝库

初识solr技术(solr算法)

为什么使用Solr

SQL查询语言中可以借助join关键字实现多表关联查询,可以借助like关键字对数据进行模糊查询,然而如果表中数据量特别巨大(比如有亿万条数据),或者查询字段中数据特别庞大(比如保存一篇文章)就不适合使用like或join关键字进行查询,此时就需要借助诸如Solr这样的专业搜索引擎服务器进行查询。Solr是一个独立的、开源的、基于Lucene的Java企业级全文搜索引擎应用服务器。

如何搭建Solr

1、下载Solr,这里下载solr-6.6.0.zip:

2、安装JDK。注意:Solr-6.6.0只能运行在1.8甚至更高版本的JDK环境中

3、解压solr-6.6.0.zip,这里解压到D盘Program_Files文件件,如下图:

说明:

a、bin:存放solr的运行脚本

b、contrib:存放扩展solr功能的插件

c、dist:存放solr jar包文件

d、docs:存放solr API文档

e、example:存放Solr简单示例

f、licenses:存放solr许可信息。

g、server:存放了一个Solr Web应用程序和一个发布该Web程序的Jetty服务器

4、Solr默认采用格林威治区时计时(这一点在Solr启动后,打开solr-6.6.0根目录\server\logs\ solr.log文件即可一目了然),可以通过如下操作进行修改:

a、Windows操作系统:使用Notepad++打开solr-6.6.0根目录\bin\solr.in.cmd配置文件;去掉50行REM并将值设为UTC+8(注意不加双引号)。

b、Linux操作系统:使用Notepad++打开solr-6.6.0根目录\bin\solr.in.sh配置文件;去掉64行#号并将值设为"UTC+8"。

5、创建存放所有Solr indexes索引文件(又称为cores核心文件)和配置文件的solr.home目录(这里在D盘根目录创建一个名solr_cores的文件夹),并将solr-6.6.0根目录\server\solr下的所有文件复制到该文件夹内,如下图:

说明:默认solr.home目录为solr-6.6.0根目录\server\solr

7、打开DOS窗口,将路径切换到solr-6.6.0根目录\bin目录,然后执行“solr start”命令启动Solr,出现下图:

a、如果使用solr内置Jetty Web服务器发布其内置Web项目,则无法通过如下方式指定solr.home目录路径:去掉“solr-6.6.0根目录\server\solr-webapp\webapp\WEB-INF目录”下web.xml文件40~46行的注释;然后修改env-entry-value标签的值为solr.home目录路径——这种指定solr.home目录的方式在使用Tomcat发布Solr Web程序时才会使用。

b、Solr5.0以前的版本里面有独立的war供在诸如Tomcat Web服务器中发布,但从Solr5.0.0开始,Solr已不再提供独立的war,而是直接使用内置的Jetty Web服务器发布“solr-6.6.0根目录\server\solr-webapp\webapp”路径下的Web程序,详见:

c、可以通过执行solr stop -all命令停掉Solr。

8、打开浏览器,输入地址,出现下图:

9、执行“solr create -c sirius”命令,此时在solr.home目录下会新建一个名为sirius的文件夹,该文件夹中conf和data子文件夹分别保存配置文件和索引文件,如下图所示:

10、修改上图conf文件夹schema.xml文件,添加Solr字段(类似于数据库中的字段):删掉124~128区间配置的field和copyField标签,将下面内容拷贝到123行:

<field name="name" type="text_general" indexed="true" stored="true"/><!-- 书名 -->

<field name="author" type="text_general" indexed="false" stored="true"/><!-- 作者 -->

<field name="summary" type="text_general" indexed="true" stored="true"/><!-- 简介 -->

<field name="price" type="float" indexed="false" stored="true"/><!-- 价格 -->

<field name="createTime" type="date" indexed="false" stored="true"/><!-- 数据创建时间 -->

<field name="keywords" type="text_general" indexed="true" stored="false" multiValued="true" />

<!-- 按keywords列查询时实际是查找namesummary中符合查询条件的数据 -->

<copyField source="name" dest="keywords" />

<copyField source="summary" dest="keywords" />说明:

a、name为"_version_"和name为"_text_"的field标签不能删除;

11、Solr操作数据:

a、将数据导入Solr索引库:可以通过Java代码或为Solr配置数据源的方式将数据导入Solr索引库。

Java代码将数据导入Solr索引库

import java.util.Date;

import org.apache.solr.client.solrj.impl.HttpSolrClient;

import org.apache.solr.common.SolrInputDocument;

public class Test {

public static void main(String[] args) throws Exception {

final String SOLR_CORE = "sirius";//solr home内选择具体的某个solr core

final String SOLR_URL = "http://localhost:8983/solr/";//solr 服务器地址

SolrInputDocument solrInputDocument = new SolrInputDocument();

//往solrInputDocument中添加字段,所添加的字段必须是Solr managed-schema文件中所定义的

solrInputDocument.addField("id", "00000000-0000-0000-0000-000000000004");//主键

solrInputDocument.addField("name", "朝花夕拾");//书名

solrInputDocument.addField("author", "鲁迅");//作者

solrInputDocument.addField("summary", "本书采用夹叙夹议的方法,以青少年时代的生活经历为线索,真实生动地叙写了自己从农村到城镇,从家庭到社会,从国内到国外的一组生活经历,抒发了对往昔亲友和师长的怀念之情,同时也对旧势力、旧文化进行了嘲讽和抨击。");//简介

solrInputDocument.addField("price", 23.9);//价格

solrInputDocument.addField("createTime", new Date());//数据创建时间

HttpSolrClient httpSolrClient = new HttpSolrClient.Builder(SOLR_URL + SOLR_CORE).build();

httpSolrClient.add(solrInputDocument);//向Solr索引库添加数据

httpSolrClient.commit();

httpSolrClient.close();

}

}

为Solr配置数据源将数据导入Solr索引库

a、配置数据库映射:在D:\solr_cores\sirius\conf目录创建一个名为data-config.xml的文件,写入如下代码:

<dataConfig>

<script>

<![CDATA[

function startDateTransform(row){

// Get the timestamp and convert it to a date,注意:必须将createTime全部大写

var dateVal = row.get("CREATETIME").dateValue();

// Put the correct date object into the original column,注意:必须将createTime全部大写

row.put("CREATETIME", dateVal);

return row;

}

]]>

</script>

<dataSource

name="oracle_db" type="JdbcDataSource"

driver="oracle.jdbc.driver.OracleDriver"

url="jdbc:oracle:thin:@192.168.30.212:1521:keeper"

user="scott" password="root"/>

<document name="book">

<entity

name="book" pk="id" dataSource="oracle_db"

query="select id, name, price, author, summary, cast(create_time as timestamp) as createTime from book"

transformer="script:startDateTransform">

<field column="id" name="id"/>

<field column="name" name="name"/>

<field column="price" name="price"/>

<field column="author" name="author"/>

<field column="summary" name="summary"/>

<field column="createTime" name="createTime"/>

</entity>

</document>

</dataConfig>

b、将数据库映射文件关联到D:\solr_cores\sirius\conf目录solrconfig.xml文件:

①、在74行注解下面添加<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />,即添加DIH jar包依赖

②、在solrconfig.xml文件858行添加如下内容:

<requestHandler name="/dataimport" class="solr.DataImportHandler">

<lst name="defaults">

<str name="config">data-config.xml</str>

</lst>

</requestHandler>

c、将oracle数据库驱动jar包拷贝到&ldquo;solr-6.6.0根目录\server\solr-webapp\webapp\WEB-INF\lib&rdquo;目录。

d、重启Solr,打开浏览器,按步骤进行如下操作:

e、按步骤进行如下操作即可查询所有数据:

q:查询的关键字,此参数最为重要,例如name:*传* AND summary:*本*(即查询书名中含有&ldquo;传&rdquo;字且简介中含有&ldquo;本&rdquo;字的书籍信息,注意:AND或OR不能小写,必须大写),默认为*:*(即查询所有数据)

fq:(filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:price:[15.0 TO 20.0]表示查询price在15.0~20.0的所有书籍。

sort:排序方式,例如price desc表示按照price降序

start:指定从第几条记录开始返回结果,默认从0开始,一般用于分页

  rows:指定返回结果最多有多少条记录,默认值为 10,与start一起使用以实现分页

fl:指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如id,name,price,author,createTime

df:默认的查询字段,一般默认指定

wt:(writer type)指定输出格式,有 xml, json, php等

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接