运行Solr在其内嵌的Jetty中及Solr图形面板介绍

说明:Solr5及其之后的版本Solr4及之前的版本最大的区别是Solr5及之后的版本被发布成了一个独立的应用。而不再需要tomcat等容器(注:我们当然也可以改装,使新版本也可以运行在Tomcat下)。在其内部集成了jetty服务器,可以通过bin目录的脚本直接运行启动。

下面介绍Solr如何运行在内嵌的Jetty中(至于如何改造使其运行在Tomcat下这里就不再介绍了,感兴趣的朋友可以私信问我)。

运行Solr在其内嵌的Jetty中及相关介绍

Solr的安装及配置

声明:一下步骤以Windows为例,Linux上也是差不多的

第一步:下载Solr并解压

第二步:在bin目录下的打开cmd窗口>>>solr start启动Slolr

第三步:访问http://localhost:8983/solr/#/即可

Solr管理界面介绍

Dashboard: 仪表仓(对Solr服务器运行情况的监控,可查看到solr运行时间、 solr版本,系统内存、虚拟机内存的使用情况)。

Logging: 日志

Core Admin: SolrCore的管理功能。一个solr服务器可以有多个SolrCore,每个SolrCore就是一个独立的索引库。

Core Admin中主要有主要有:

Add Core(添加核心), Unload(卸载核心),Rename(重命名核心),Reload(重新加载核心),Optimize(优化索引库)

Add Core是添加core:主要是在instanceDir对应的文件夹里生成一个core.properties文件。

创建SolrCore方式一:

第一步:在解压后的solr-7.3.0\server\solr文件夹下创建一个文件夹,名字自取即可(一个文件夹对应一个SolrCore索引库)

第二步:将solr-7.3.0\server\solr\configsets\_default下的conf文件夹,拷贝至上一步创建的文件夹中

拷贝至:

第三步:在Solr的Admin Core图形界面添加SolrCore即可

此时可看见,应有我们创建的solr_core索引库了:

创建SolrCore方式二:

如果我们之前已经有SolrCore了,那么也我们可以通过复制修改该SolrCore来创建新的SolrCore。

第一步:复制一份之前已经配好了并且已经利用该文件夹创建了SolrCore的文件夹,并重命名(这里:复制jetty_solr_core文件夹并重命名为my_solr_core)。

第二步:进入my_solr_core文件夹,修改core.properties文件:将对应的参数信息修改为要新创建的SolrCore的信息。

第三步:重启Solr,再访问即可看见除了方式一创建了的SolrCore,还有方式二创建的SolrCore

Java Properties:Java参数信息

Thread Dump:线程、线程的运行状态、标识和调用的堆栈 信息

 managed-schema文件、域

managed-schema文件(低版本Solr则是schema.xml)在Solr解压后的solr-7.3.0\server\solr\configsets\_default\conf目录下,它是Solr数据表配置文件,在此配置文件中定义了域以及域的类型还有其他一些配置,在solr中域必须先定义后使用

Field(域)

定义Field域

  • name:域的名称
  • type:域的类型
  • indexed:是否索引
  • stored:是否存储
  • required:是否必须
  • multiValued:是否是多值,存储多个值时设置为true,solr允许一个Field存储多个值,比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图)

DynamicField(动态域)

  • name:动态域的名称,是一个表达式,*匹配任意字符,只要域的名称和表达式的规则能够匹配就可以使用。
    如:搜索时查询条件“product_i:钻石”就可以匹配这个动态域,可以直接使用,不用单独再定义一个product_i域。
  • uniqueKey:指定唯一键
    <uniqueKey>id</uniqueKey>其中的id是在Field标签中已经定义好的域名,而且该域要设置为required为true。一个schema.xml文件中必须有且仅有一个唯一键。

copyField(复制域)

可以将多个Field复制到一个Field中,以便进行统一的检索。当创建索引时,solr服务器会自动的将源域的内容复制到目标域中。

  • source:对应源域(域名)
  • dest:对应目标域(域名),搜索时,指定目标域为默认搜索域,可以提供查询效率。

注:由dest指的的目标域,必须设置multiValued为true,如:

fieldType(域类型)

定义域的类型

  • name:域类型的名称
  • class:指定域类型的solr类型。
  • analyzer:指定分词器。在FieldType定义的时候最重要的就是定义这个类型的 数据在建立索引和进行查询的时候要使用的分析器analyzer,包括 分词和过滤。
  • type:index和query。Index 是创建索引,query是查询索引。
  • tokenizer:指定分词器
  • filter:指定过滤器

SolrCore索引库的介绍与使用

一个solr服务器可以有多个SolrCore,每个SolrCore就是一个独立的索引库。

声明:以我后来又创建的名为my_first_solr_core的SolrCore为例进行说明

总体说明:

  • Overview:概览(包含基本统计信息,如:Statistics、Instance、Replication 等)。
  • Analysis:分析(检验分词效果,对目标字段进行分词)。
  • Dataimport:数据导入(将数据库的数据通过此选项导入)。
  • Documents:在这里,增、删、改索引。
  • Files:点击开查看当前SolrCore对应的文件夹下的conf目录下的文件等。
  • Ping:查看当下与Solr服务器的连接延迟情况。
  • Plugins / Stats:SolrCore运行时,各种插件的统计数据和状态信息。
  • Query:查询(一般用于对索引了的索引进行查询测试)。
  • Replication:显示当前SolrCore的副本,并提供disable/enable功能。
  • Schema:展示SolrCore的schema数据(solr7版本用的是managed-schema,此 版本还可以通过该页面修改,增加,删除schema的字段。)
  • Segments info:展示底层Lucence的分段信息。

 

下面对个别进行详细说明示例:

Analysis使用示例

分析时,会智能地识别单词(而不会将单词拆分为一个一个的字母)

而当我们使用中文时,会发现分析结果不理想(其不能将中文按词汇进行分析),如:

此时,我们需要配置中文分词:

我们选择IKAnalyzer作为中文分词器。

第一步:将jar包放进solr-7.3.0\server\solr-webapp\webapp\WEB-INF\lib下

第二步:将IKAnalyze对应的xml文件和扩展词汇文件放进solr-7.3.0\server\solr-webapp\webapp\WEB-INF下的classes文件夹(无则创建)下

第三步:在solr-7.3.0\server\solr目录中,对应(SolrCore的)文件夹下的conf文件夹中的managed-schema文件里,添加中文分词器的信息

添加fieldType

    <!-- 添加IKAnalyzer分词器fieldType-->
    <fieldType name="text_ik" class="solr.TextField">
        <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>

定义field,指定field的type属性为刚才添加的分词器fieldType的name名,即“text_ik”

    <!--IKAnalyzer Field-->
    <field name="content_ik" type="text_ik" indexed="true" stored="true" />

提示:fieldType最好和其他的fieldType放在一起;field最好和其他的field放在一起

第四步:重启Solr,并再使用中文测试一下。

配置中文分词并重启Solr之后,我们使用中文来测试:

由此可见:中文分词器配置成功

Documents使用示例

在此界面,无论是增、删还是改,都使用的是/update。

声明:增、删、改的方式较多,这里增、删、改都各示例其中的一种

改(注:如果有,那么就改;如果没有那么就增):

删:

增:

无论是增、删还是改,点击Submit Document操作成功后,都会在右侧给出提示信息(注:失败了也会有失败了的提示信息):

注:

overwrite="true":solr在做索引的时候,如果文档已经存在,就用xml 中的文档进行替换

commitWithin="1000":solr 在做索引的时候,每个1000(1秒)毫秒, 做一次文档提交。为了方便测试也可以在Document 中立即提交, </doc>后添加“<commit/>”

Query使用示例

在查询之前,我们用Documents多增加几条数据(这里就不一一示范增了)。

注:我们还可以使用通配,如:*:*就表示查询所有的;查询时,这里查询时,还可以设置一切其他的约束(见上图黄色的框圈起来的内容),这里简单介绍其中几个(见下页):

上面的配置执行结果示例(由于分页设置成10的话,结果太长不好截图,所以下面这个是我把又分页改为0,3后截的图,其他的设置都和上面一样):

注:此结果是我导入了数据后的查询结果;怎么导入数据见Dataimport示例。

Dataimport使用示例

先配置dataimportHandler插件:

第一步:将Solr解压后的dist文件夹下的solr-dataimporthandler-7.3.0.jarsolr-dataimporthandler-extras-7.3.0.jar以及数据库连接jar    拷贝至对应的SolrCore目录下的lib文件夹(无则创建)中。

拷贝至

第二步:配置当前SolrCore对应文件夹下conf目录中的solrconfig.xml文件

<!-- 配置dataimportHandler的导入处理器 -->
<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(注:此xml应放在上一步配置的位置,这里即:与solrconfig.xml同级目录下)

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
 
  <!-- 数据库连接配置 -->
  <!-- url中最后要加上serverTimezone=UTC否则发送请求的时候会乱码 -->
  <dataSource driver="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://localhost:3306/index_demo?serverTimezone=UTC" 
        user="root" 
        password="pass"/>
 
  <document>
    <!-- query中写SQL语句 -->
    <entity name="product" query="SELECT pid,name,catalog,catalog_name,price,description,picture FROM products">
      <!-- 
          配置查询出来的列column  与 Solr中Field域的对应映射关系
         (注:对应的Field域在managed-schema中没有的话需要配置)
      -->
      <!-- name对应Field域;column对应表的列 -->
      <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>

注:如果没有现成的可用的Field域的话,name可以随便取一个,然后下一步创了对应name的Field域即可。

第四步:在当前SolrCore对应文件夹下的conf文件夹中的managed-schema文件里创建与第四步中对应name的Field域(创建缺少的即可)

<!--product表对应列还额外需要的Field-->
<!-- 商品名称 -->
<field name="product_name" type="text_ik" indexed="true" stored="true"/>
<!-- 商品分类ID -->
<field name="product_catalog" type="string" indexed="true" stored="true"/> 
<!-- 商品分类名称 -->
<field name="product_catalog_name" type="string" indexed="true" stored="false"/>
<!-- 商品价格 -->
<field name="product_price" type="pfloat" 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域copy值同一个目标域;
    此时检索目标域时,就相当于同时检索了这两个域 
-->
<!-- 目标域 -->
<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"/>

注:域最好和已有的域放在一起,不要乱放,否者有时会加载域失败。

第五步:重启Solr并执行dataimport

注:导入数据前会先清空索引库,然后再导入。

第七步:Query一下刚才导入的数据,验证是否导入数据成功

注:在看这里就可以看出copyField域的作用了(这里我查product_keywords域中的“冰箱”,就相当于查了product_name和product_description

域中的数据)。

特别说明:

       我们将数据库中表的数据数据Dataimport进Solr之后,查询数据时,就可以直接在Solr中查询即可;此时,如果原数据库表中新增了数据,那么我们应在给表新增数据时,同时将该数据通过SolrJ写入Solr中。删除与修改也是如此。

       由于我们一般都是只将那些需要经常查询的表Dataimport进Solr,所以有时候如果我们从Solr中得不到全部的信息时,我们可以通过Solr快速定位目标ID,然后再直接根据ID查询数据库中的表。

微笑参考链接

微笑文章中涉及到的资料、文件、普通Java项目使用SolrJ的示例项目等托管在

微笑如有不当之处,欢迎指正

微笑本文已经被收录进《程序员成长笔记(二)》,笔者JustryDeng

猜你喜欢

转载自blog.csdn.net/justry_deng/article/details/81546453
今日推荐