Solr 入门

栏目: 数据库 · 发布时间: 7年前

内容简介:Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器。Solr比lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化。Solr是如何实现全文检索的呢?

Solr是apache的顶级开源项目,它是使用 java 开发 ,基于lucene的全文检索服务器。

Solr比lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化。

Solr是如何实现全文检索的呢?

索引流程:solr客户端(浏览器、java程序)可以向solr服务端发送POST请求,请求内容是包含Field等信息的一个xml文档,通过该文档,solr实现对索引的维护(增删改)

搜索流程:solr客户端(浏览器、java程序)可以向solr服务端发送GET请求,solr服务器返回一个xml文档。

Solr同样没有视图渲染的功能。

solr 和 lucene 的区别

Lucene 是一个全文检索引擎 工具 包,它是一个 jar 包,不能独立运行,对外提供服务。

Solr 是一个全文检索服务器,它可以单独运行在 servlet 容器,可以单独对外提供搜索和索引功能。Solr 比 lucene 在开发全文检索功能时,更快捷、更方便。

Solr 入门

solr 的安装配置

下载

solr 和 lucene 的版本时同步更新的,最新版本是5.2.1

下载地址:http://archive.apache.org/dist/lucene/solr/

Solr 入门
Solr 入门

环境

jdk:1.7及以上 solr:4.10.3 mysql:5x web服务器:tomcat7

初始化数据库脚本

solr 安装配置

  • 安装 tomcat
  • 将solr-4.10.3\example\webapps 目录下 solr.war 拷贝到 tomcat webapps 目录下
  • 解压缩 war 包,解压缩之后,将 war 包删掉
  • 添加 solr 扩展服务包。将 solr-4.10.3\example\lib\ext 目录下 jar 拷贝到 tomcat solr WEB-INF lib 目录下
  • 添加 log4j.properties。拷贝 solr-4.10.3\example\resources 目录下 log4j.properties 到 apache-tomcat-7.0.57\webapps\solr\WEB-INF\classes ,目录不存在没有则创建。
  • 在 web.xml 中指定 solrhome 的目录
    Solr 入门

solrcore 安装

solrcore 和 solrhome

Solrhome是solr服务运行的主目录,一个solrhome目录里面包含多个solrcore目录,一个solrcore目录里面了一个solr实例运行时所需要的配置文件和数据文件。

每一个solrcore都可以单独对外提供搜索和索引服务。 多个solrcore之间没有关系。

solrcore 和 solrhome 的目录结构

solrhome: solr-4.10.3\example\solr solrcore: solr-4.10.3\example\solr\collection1 包含配置文件,索引文件日志信息

solrcore 的安装

安装 solrcore 需要先安装 solrhome 将上面solrhome下的文件拷贝到web.xml中指定的solrhome中即可

Solr 入门

solrcore 的配置

配置 solrcore 的 conf 目录下的 solrconfig.xml 配置文件,来配置 solrcore 的运行信息。

在该文件中,主要配置三个标签:lib 标签、datadir标签、requestHandler 标签。

lib 标签

solrcore 需要添加一个扩展依赖包,通过 lib 标签来指定依赖包的地址

solr.install.dir 表示 solrcore 的安装目录

拷贝 example 目录下的 contrib 和 dis 目录到

Solr 入门

修改 lib 标签

Solr 入门

datadir 标签

每个 solrcore 都有自己的索引文件目录,默认在 solrcore 目录下的 data 中。

Solr 入门

data数据目录下包括了index索引目录 和tlog日志文件目录。 如果不想使用默认的目录也可以通过solrConfig.xml更改索引目录 ,如下:

Solr 入门

requestHandler 标签

requestHandler 请求处理器,定义索引和搜索的访问方式。 通过 /update 维护索引,可以完成对索引的添加、修改、删除操作。

Solr 入门

提交 xml、json 数据完成索引维护。

通过 /select 搜索索引

Solr 入门

设置搜索参数完成搜索,搜索参数也可以设置一些默认值,如下:

<requestHandler name="/select" class="solr.SearchHandler">
    <!-- 设置默认的参数值,可以在请求地址中修改这些参数-->
    <lst name="defaults">
        <str name="echoParams">explicit</str>
        <int name="rows">10</int><!--显示数量-->
        <str name="wt">json</str><!--显示格式-->
        <str name="df">text</str><!--默认搜索字段-->
    </lst>
</requestHandler>
复制代码

solr 界面

Solr 入门

Dashboard

仪表盘,显示 solr 实例运行时间、版本、系统资源、jvm等信息。 、

Logging

solr 运行日志信息

Cloud

Cloud即SolrCloud,即Solr云(集群),当使用Solr Cloud模式运行时会显示此菜单.

Core Admin

solrcore 的管理界面,这里可以添加 solrcore 实例。

java properties

solr 在 jvm 运行环境中的属性信息。

Thread Dump

显示 solr server 中当前活跃线程信息,同时也可以跟踪线程运行栈信息。

Core selector

选择一个 solrcore 进行详细操作,如下:

Solr 入门

Analysis

Solr 入门

通过此界面可以测试索引分析器和搜索分析器的执行情况。 注:solr 中,分析器是绑定在域类型中的。

dataimport

可以定义数据导入处理器,从关系数据库导入到 solr 索引库中。默认配置,需要手工配置。

Document

通过 /update 表示更新索引,solr 默认根据 id(唯一约束) 域来更新 document 的内容,如果根据 id 值搜索不到 id 域则会执行添加操作,如果找到则更新。

通过此菜单可以创建索引、更新索引、删除索引等操作,界面如下:

Solr 入门
  • overwrite="true" : solr在做索引的时候,如果文档已经存在,就用xml中的文档进行替换
  • commitWithin="1000" : solr 在做索引的时候,每个1000(1秒)毫秒,做一次文档提交。为了方便测试也可以在Document中立即提交,后添加“”

Query

通过/select执行搜索索引,必须指定“q”查询条件方可搜索。

Solr 入门

多 solrcore 配置

配置多solrcore的好处: 1、在进行 solrcloud 的时候,必须配置多solrcore 2、每个 solrcore 之间是独立的,都可以单独对外提供服务。不同的业务模块可以使用不同的solrcore 来提供搜索和索引服务。

添加

  • 第一步:复制 solrhome 下的 collection1 目录到本目录下,修改名称为 collection2
  • 修改 solrcore 目录下的 core.properties
    Solr 入门
    这样多 solrcore 就配置完成了。

Solr 基本使用

schema.xml

在 schema.xml 文件中,主要配置了 solrcore 的一些数据信息,包括 Field 和 FieldType 的定义等信息,在 solr 中,Field 和 FieldType 都需要先定义后使用。

Field

定义Field域

Name:指定域的名称 Type:指定域的类型 Indexed:是否索引 Stored:是否存储 Required:是否必须 multiValued:是否多值,比如商品信息中,一个商品有多张图片,一个Field像存储多个值的话,必须将multiValued设置为true。

dynamicField

动态域

Name:指定动态域的命名规则

uniqueKey

指定唯一键

id

其中的id是在Field标签中已经定义好的域名,而且该域要设置为required为true。

一个schema.xml文件中必须有且仅有一个唯一键

copyField

复制域

Source:要复制的源域的域名 Dest:目标域的域名

由dest指的的目标域,必须设置multiValued为true。

Solr 入门

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>
复制代码

Name:指定域类型的名称 Class:指定该域类型对应的solr的类型 Analyzer:指定分析器 Type:index、query,分别指定搜索和索引时的分析器 Tokenizer:指定分词器 Filter:指定过滤器

中文分词器

使用ikanalyzer进行中文分词

  • 第一步:将ikanalyzer的jar包拷贝到以下目录

    Solr 入门
  • 第二步:将ikanalyzer的扩展词库的配置文件拷贝到 目录

    Solr 入门
  • 配置 FieldType

    Solr 入门
  • 配置使用中文分词的 field

    Solr 入门
  • 重启 tomcat

    Solr 入门

配置业务 Field

需求

对京东案例中的 products 表的数据进行索引,所以需要定义对应的 field 域。

分析配置

Solr 入门

需要往索引库添加的字段有: pid、name、catalog、catalog_name、price、description、picture

FieldType: 经分析,由于中文分词器已经配置完FieldType,所以目前FieldType已经满足需要,无需配置。

Field: Pid: 由于pid在products表中是唯一键,而且在solr的shema.xml中已有一个id的唯一键配置,所以不需要再重新定义pid域。

Name:

<!-- 商品名称 -->
<field name="product_name" type="text_ik" indexed="true" stored="true"/>
复制代码

Catalog、catalog_name:

<!-- 商品分类ID -->
<field name="product_catalog" type="string" indexed="true" stored="true"/> 
<!-- 商品分类名称 -->
<field name="product_catalog_name" type="string" indexed="true" stored="false"/>
复制代码

Price:

<!-- 商品价格 -->
<field name="product_price" type="float" indexed="true" stored="true"/>
复制代码

Description:

<!-- 商品描述 -->
<field name="product_description" type="text_ik" indexed="true" stored="false"/>
复制代码

Picture:

<!-- 商品图片地址 -->
<field name="product_picture" type="string" indexed="false" stored="true"/> 
复制代码
<!-- 目标域 -->
<field name="product_keywords" type="text_ik" indexed="true" stored="true" multiValued="true"/>

<!-- 将商品名称添加到目标域 -->
<copyField source="product_name" dest="product_keywords"/>

<!-- 将商品描述添加到目标域 -->
<copyField source="product_description" dest="product_keywords"/>
复制代码

Dataimport

该插件可以将数据库中指定的 sql 语句的结果导入到solr索引库中。

  • 第一步:添加 jar 包 Dataimport的jar包(solr-4.10.3\dist\solr-dataimporthandler-extras-4.10.3.jar) 复制到

    Solr 入门
    修改 solrconfig.xml 文件,添加 lib 标签 <lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar" />

    mysql 数据库驱动包 复制 mysql 驱动包到:

    Solr 入门
    修改solrconfig.xml文件,添加lib标签 <lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".*\.jar" />
  • 第二步:配置 requesthandler 在 solrconfig.xml 中,添加一个 dataimport 的 requestHandler

    Solr 入门
    <requestHandler name="/dataimport"     class="org.apache.solr.handler.dataimport.DataImportHandler">
          <lst name="defaults">
              <str name="config">data-config.xml</str>
          </lst>
    </requestHandler>
    复制代码
- 第三步:创建 data-config.xml
  在 solrconfig.xml 同级目录下,创建 data-config.xml
![](http://pbzzkhjh1.bkt.clouddn.com/1c648865-30cb-4dbe-9133-525692211bf4.jpg)
```xml
<dataConfig>
    <dataSource 
        type="JdbcDataSource"
        driver="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/taotao" 
        user="root"
        password="root"/>

    <document>
        <entity name="products" query="select pid,name,catalog,catalog_name,price,description,picture from products ">
            <field column="pid" name="id" />
            <field column="name" name="product_name" />
            <field column="catalog" name="product_catalog" />
            <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>
复制代码
  • 第四步:重启 tomcat
    Solr 入门

solrj 的使用

什么是 solrj

solrj 就是 solr 服务器的 java 客户端

Solr 入门

环境准备

jdk ide tomcat solrj

搭建工程

  • solrj 的依赖包和核心包

    Solr 入门
  • solrj 的扩展服务包

    Solr 入门

使用 solrj 完成索引维护

添加/修改索引

在solr中,索引库中都会存在一个唯一键,如果一个Document的id存在,则执行修改操作,如果不存在,则执行添加操作。

@Test
    public void insertAndUpdateIndex() throws Exception {
        // 创建HttpSolrServer
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");
        // 创建Document对象
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id", "c001");
        doc.addField("name", "solr test111");
        // 将Document对象添加到索引库
        server.add(doc);
        // 提交
        server.commit();
    }
复制代码

删除索引

根据指定 id 来删除

根据条件来删除

@Test
    public void deleteIndex() throws Exception {
        // 创建HttpSolrServer
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");

        // 根据指定的ID删除索引
        // server.deleteById("c001");

        // 根据条件删除
        server.deleteByQuery("id:c001");

        // 删除全部(慎用)
        server.deleteByQuery("*:*");

        // 提交
        server.commit();
    }
复制代码

查询索引

简单查询

@Test
    public void search01() throws Exception {
        // 创建HttpSolrServer
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");
        // 创建SolrQuery对象
        SolrQuery query = new SolrQuery();
        // 输入查询条件
        query.setQuery("product_name:小黄人");
        // 执行查询并返回结果
        QueryResponse response = server.query(query);
        // 获取匹配的所有结果
        SolrDocumentList list = response.getResults();
        // 匹配结果总数
        long count = list.getNumFound();
        System.out.println("匹配结果总数:" + count);
        for (SolrDocument doc : list) {
            System.out.println(doc.get("id"));
            System.out.println(doc.get("product_name"));
            System.out.println(doc.get("product_catalog"));
            System.out.println(doc.get("product_price"));
            System.out.println(doc.get("product_picture"));
            System.out.println("=====================");
        }
    }
复制代码

复杂查询

solr的查询语法

1.q - 查询关键字,必须的,如果查询所有使用 *:* 。 请求的q是字符串

Solr 入门

2.fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:: 请求fq是一个数组(多个值)

Solr 入门

过滤查询价格从1到20的记录。 也可以在“q”查询条件中使用product_price:[1 TO 20],如下:

Solr 入门
也可以使用“*”表示无限,例如: 20以上:product_price:[20 TO ] 20以下:product_price:[

TO 20]

3.sort - 排序,格式:sort=+<desc|asc>[,+<desc|asc>]… 。示例:

Solr 入门

按价格降序

4.start - 分页显示使用,开始记录下标,从0开始

5.rows - 指定返回结果最多有多少条记录,配合start来实现分页。 实际开发时,知道当前页码和每页显示的个数最后求出开始下标。

6.fl - 指定返回那些字段内容,用逗号或空格分隔多个。

Solr 入门

显示商品图片、商品名称、商品价格

7.df-指定一个搜索Field

Solr 入门

也可以在SolrCore目录 中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。

Solr 入门

8.wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。

9.hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。

Solr 入门

代码

@Test
    public void search02() throws Exception {
        // 创建HttpSolrServer
        HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");
        // 创建SolrQuery对象
        SolrQuery query = new SolrQuery();

        // 输入查询条件
        query.setQuery("product_name:小黄人");
        // query.set("q", "product_name:小黄人");

        // 设置过滤条件
        // 如果设置多个过滤条件的话,需要使用query.addFilterQuery(fq)
        query.setFilterQueries("product_price:[1 TO 10]");

        // 设置排序
        query.setSort("product_price", ORDER.asc);
        // 设置分页信息(使用默认的)
        query.setStart(0);
        query.setRows(10);

        // 设置显示的Field的域集合
        query.setFields("id,product_name,product_catalog,product_price,product_picture");

        // 设置默认域
        query.set("df", "product_keywords");

        // 设置高亮信息
        query.setHighlight(true);
        query.addHighlightField("product_name");
        query.setHighlightSimplePre("<em>");
        query.setHighlightSimplePost("</em>");

        // 执行查询并返回结果
        QueryResponse response = server.query(query);
        // 获取匹配的所有结果
        SolrDocumentList list = response.getResults();
        // 匹配结果总数
        long count = list.getNumFound();
        System.out.println("匹配结果总数:" + count);

        // 获取高亮显示信息
        Map<String, Map<String, List<String>>> highlighting = response
                .getHighlighting();
        for (SolrDocument doc : list) {
            System.out.println(doc.get("id"));

            List<String> list2 = highlighting.get(doc.get("id")).get(
                    "product_name");
            if (list2 != null)
                System.out.println("高亮显示的商品名称:" + list2.get(0));
            else {
                System.out.println(doc.get("product_name"));
            }

            System.out.println(doc.get("product_catalog"));
            System.out.println(doc.get("product_price"));
            System.out.println(doc.get("product_picture"));
            System.out.println("=====================");
        }
    }
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Agile Web Application Development with Yii 1.1 and PHP5

Agile Web Application Development with Yii 1.1 and PHP5

Jeffrey Winesett / Packt Publishing / 2010-08-27

In order to understand the framework in the context of a real-world application, we need to build something that will more closely resemble the types of applications web developers actually have to bu......一起来看看 《Agile Web Application Development with Yii 1.1 and PHP5》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具