028-86261949

当前位置:首页 > 技术交流 > Solr8.2入门(下)

Solr8.2入门(下)

2019/09/10 17:48 分类: 技术交流 浏览:3

4.库的创建与域的认识

4.1创建核心

第一步:在solr-8.2.0\server\solr文件夹下面创建核心名称作为文件夹,测试名称为my_db,可以理解为新建一个库

第二步:将solr-8.2.0\server\solr\configsets\_default下面的conf文件夹拷贝到solr-8.2.0\server\solr\my_db目录下,这是关于库所需的核心配置文件如下图

第三步:访问管理界面,选择Core Admin创建核心,右侧name和instanceDir输入名称和核心文件夹保持一致

 

4.2 创建表与字段

 

点击Add Field 添加my_title,类型为string

 

5.集成IK分词器

第一步:先下载solr对应版本的ik分词器,下载地址:

https://search.maven.org/search?q=com.github.magese

第二步:将下载好的jar包放入solr-8.2.0/server/solr-webapp/webapp/WEB-INF/lib目录中

第三步:将jar包目录下的5个配置文件(IKAnalyzer.cfg.xml、 ext.dic、 stopword.dic、 ik.conf、 dynamicdic.txt

)放入solr服务的Jetty或Tomcat的 solr-8.2.0\server\solr-webapp\webapp\WEB-INF\classes目录下;(如果无classes新建一个)

 

第四步:solr-8.2.0\server\solr\my_db\conf目录中打开managed-schema文件,增加如下代码

<!-- ik分词器 -->

<fieldType name="text_ik" class="solr.TextField">

  <analyzer type="index">

      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>

      <filter class="solr.LowerCaseFilterFactory"/>

  </analyzer>

  <analyzer type="query">

      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>

      <filter class="solr.LowerCaseFilterFactory"/>

  </analyzer>

</fieldType>

 

 

第五步(选择性配置):IKAnalyzer.cfg.xml是配置扩展词库的配置文件,可以指定分词结构

如果有多个词典用;隔开。

 

6.导入数据库中的数据

第一步:将\solr-8.2.0\example\example-DIH\solr\db下的文件拷贝到solr-8.2.0\server\solr\my_db中

第二步:拷贝jar包,包括数据库的驱动包和solr的依赖包

拷贝到solr-8.2.0\server\solr-webapp\webapp\WEB-INF\lib中

 

以及数据的驱动包需要和当前安装的数据库版本匹配需要自行去网上下载。

 

第三步:配置solr-8.2.0\server\solr\my_news\conf\db-data-config.xml文件

<dataConfig>  

<dataSource type="JdbcDataSource"  

                driver="com.mysql.jdbc.Driver"  

                url="jdbc:mysql://localhost:3306/test"  

                user="root"  

                password="admin"/>  

<document>  

       <entity name="tnews" query="SELECT id,product_name,sale_price FROM product">

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

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

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

       </entity>  

</document>  

 

</dataConfig>

 

既数据库的链接信息和sql语句,以及把对应的数据导入到哪一个域里面。

 

 

第四步:管理界面更新索引库

 

 

7.浏览器界面实现数据的增删改查

 

7.1添加/更新文档

 

 

7.2删除文档

 

删除索引格式如下:

 

1) 删除制定ID的索引 <delete>

       <id>8</id>

</delete>

 

2) 删除查询到的索引数据

<delete>

       <query>my_title:幽默杂货</query>

</delete>

3) 删除所有索引数据

 <delete>

       <query>*:*</query>

</delete>

 

 

7.3查询索引

 

通过/select搜索索引,Solr制定一些参数完成不同需求的搜索:

 

1、q - 查询字符串,必须的,如果查询所有使用*:*。

 

 

2、fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,

 

例如::

过滤查询价格从1到20的记录。

也可以在“q”查询条件中使用product_price:[1 TO 20],如下:

也可以使用“*”表示无限,例如:

20以上:product_price:[20 TO *]

20以下:product_price:[* TO 20]

 

3、sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。

 

示例:

按价格降序

 

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

 

5、rows - 指定返回结果最多有多少条记录,配合start来实现分页。

显示前10条。

 

 

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

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

 

7、df-指定一个搜索Field

 

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

 

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

 

8.使用Java代码实现数据的增删改查(solrJ)

 

8.1 什么是solrJ

solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:

 

 

8.2依赖jar包

 

 

8.3 添加文档

 

实现步骤

第一步:创建一个java工程

第二步:导入jar包。包括solrJ的jar包。

第三步:和Solr服务器建立连接。HttpSolrServer对象建立连接。

第四步:创建一个SolrInputDocument对象,然后添加域。

第五步:将SolrInputDocument添加到索引库。

第六步:提交。

代码实现

//向索引库中添加索引

     @Test

     public void addDocument() throws Exception {

          //和solr服务器创建连接

          //参数:solr服务器的地址

          SolrClient solrServer = new HttpSolrClient.Builder("http://localhost:8983/solr/my_db").build();

          //创建一个文档对象

          SolrInputDocument document = new SolrInputDocument();

          //向文档中添加域

          //第一个参数:域的名称,域的名称必须是在schema.xml中定义的

          //第二个参数:域的值

          document.addField("id", "c0001");

          document.addField("title_ik", "使用solrJ添加的文档");

          document.addField("content_ik", "文档的内容");

          document.addField("product_name", "商品名称");

          //把document对象添加到索引库中

          solrServer.add(document);

          //提交修改

          solrServer.commit();

         

     }

 

8.4 删除文档

 

8.4.1 根据id删除

 

//删除文档,根据id删除

     @Test

     public void deleteDocumentByid() throws Exception {

          //创建连接

          SolrClient solrServer = new HttpSolrClient.Builder("http://localhost:8983/solr/my_db").build();

          //根据id删除文档

          solrServer.deleteById("c0001");

          //提交修改

          solrServer.commit();

     }

 

8.4.2根据查询删除

查询语法完全支持Lucene的查询语法。

//根据查询条件删除文档

     @Test

     public void deleteDocumentByQuery() throws Exception {

          //创建连接

          SolrClient solrServer = new HttpSolrClient.Builder("http://localhost:8983/solr/my_db").build();

          //根据查询条件删除文档

          solrServer.deleteByQuery("*:*");

          //提交修改

          solrServer.commit();

     }

 

 

8.5 修改文档

在solrJ中修改没有对应的update方法,只有add方法,只需要添加一条新的文档,和被修改的文档id一致就,可以修改了。本质上就是先删除后添加。

 

 

8.6 查询文档

 

8.6.1简单查询

 

//查询索引

     @Test

     public void queryIndex() throws Exception {

          //创建连接

          SolrClient solrServer = new HttpSolrClient.Builder("http://localhost:8983/solr/my_db").build();

          //创建一个query对象

          SolrQuery query = new SolrQuery();

          //设置查询条件

          query.setQuery("*:*");

          //执行查询

          QueryResponse queryResponse = solrServer.query(query);

          //取查询结果

          SolrDocumentList solrDocumentList = queryResponse.getResults();

          //共查询到商品数量

          System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());

          //遍历查询的结果

          for (SolrDocument solrDocument : solrDocumentList) {

               System.out.println(solrDocument.get("id"));

               System.out.println(solrDocument.get("product_name"));

               System.out.println(solrDocument.get("product_price"));

               System.out.println(solrDocument.get("product_catalog_name"));

               System.out.println(solrDocument.get("product_picture"));

              

          }

     }

 

 

8.6.2 复杂查询

 

其中包含查询、过滤、分页、排序、高亮显示等处理。

 

//复杂查询索引

     @Test

     public void queryIndex2() throws Exception {

          //创建连接

          SolrClient solrServer = new HttpSolrClient.Builder("http://localhost:8983/solr/my_db").build();

          //创建一个query对象

          SolrQuery query = new SolrQuery();

          //设置查询条件

          query.setQuery("钻石");

          //过滤条件

          query.setFilterQueries("product_catalog_name:幽默杂货");

          //排序条件

          query.setSort("product_price", ORDER.asc);

          //分页处理

          query.setStart(0);

          query.setRows(10);

          //结果中域的列表

          query.setFields("id","product_name","product_price","product_catalog_name","product_picture");

          //设置默认搜索域

          query.set("df", "product_keywords");

          //高亮显示

          query.setHighlight(true);

          //高亮显示的域

          query.addHighlightField("product_name");

          //高亮显示的前缀

          query.setHighlightSimplePre("<em>");

          //高亮显示的后缀

          query.setHighlightSimplePost("</em>");

          //执行查询

          QueryResponse queryResponse = solrServer.query(query);

          //取查询结果

          SolrDocumentList solrDocumentList = queryResponse.getResults();

          //共查询到商品数量

          System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());

          //遍历查询的结果

          for (SolrDocument solrDocument : solrDocumentList) {

               System.out.println(solrDocument.get("id"));

               //取高亮显示

               String productName = "";

               Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();

               List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");

               //判断是否有高亮内容

               if (null != list) {

                    productName = list.get(0);

               } else {

                    productName = (String) solrDocument.get("product_name");

               }

              

               System.out.println(productName);

               System.out.println(solrDocument.get("product_price"));

               System.out.println(solrDocument.get("product_catalog_name"));

               System.out.println(solrDocument.get("product_picture"));

              

          }

     }

 

#标签:Solr8.2入门(下)