JAVA开发之Solr的配置使用和安装插件与数据库表同步数据

Solr的搭建运行

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

下载解压后的目录:


配置步骤:

1、解压solr-4.7.0.zip到你想到存放的路径,比如当前用户根目录/Users/liuxun/solr-4.7.0
2、cmd打开命令行窗口,进入/Users/liuxun/solr-4.7.0/example目录
3、执行命令:java -jar start.jar
4、通过第三步以后,系统会启动solr自带的jetty服务器,通过 http://localhost:8983/solr/便可访问solr。
此时,solr已成功启动

 操作界面说明:

 

 

命令测试管理索引

(一) 创建索引

此时solr已安装并启动,但是还没有索引,只有创建好索引,搜索才能有结果
1、命令进入/solr-4.6.0/example/exampledocs目录
2、执行命令:java -jar post.jar solr.xml monitor.xml,此时你已成功提交了2个solr文档
3、执行完第二步后,我们可以通过浏览器访问:http://localhost:8983/solr/collection1/select?q=solr&wt=xml
如果你想导入更多的文档,执行命令:java -jar post.jar *.xml

(二)更新索引

当重复执行命令:java -jar post.jar *.xml后,发现搜索的结果没有出现重复的数据,原因:example目录下的schema.xml中指定了列id为uniqueKey(即:唯一),所以重复提交数据到索引库时,id相同的数据会替换原来document中的数据。
如果想要得到重复的数据,可以通过修改exampledocs目录下*.xml中id值的方式实现

(三)删除索引

1、执行命 令:
java -Ddata=args -Dcommit=false -jar post.jar “SP2514N”,可以删除id为 SP2514N的document
2、执行第一步后,再去搜索发现搜索结果中还有id为SP2514N的数据,其实不是第一步没有删除成功,因为第一步的命令中-Dcommit=false,所以第一步的删除操作没有提交到索引(index)中。
3、在没有打开新的searcher之前,第一步删除数据会一直存在于搜索结果中,所以我们可以强制打开一个新的searcher,执行命令:java -jar post.jar -

(四)查询索引

solr通过http以get的方式进行搜索数据,如:http://localhost:8983/solr/collection1/select?q=solr&wt=xml
q:查询的关键词(此时查询的字段是solrconfig.xml中指定的默认查询字段text)
fl:搜索结果返回的字段
sort:排序
wt:搜索结果返回格式
q=video&fl=name,id (return only name and id fields)
q=video&fl=name,id,score (return relevancy score as well)
q=video&fl=*,score (return all stored fields, as well as relevancy score)
q=video&sort=price desc&fl=name,id,price (add sort specification: sort by price descending)
q=video&wt=json (return response in JSON format)

使用SolrJ与Solr服务器交互

我们要使用Solr服务,可以直接使用urlconnecion按照规则去调用Solr服务的接口,如果是web应用除了可以使用URLConnection在后台调用外还可以使用AJAX技术(XmlHttpRequest)调用,但是需要自己封装数据,解析数据,非常麻烦。

SolrJ提供了针对各种客户端的API,可以省去这些繁琐的步骤,面向API编程 直接与Solr服务器进行交互。

SolrJ的简介和使用

 solrj是solr的java客户端,用于访问solr索引库。
它提供了添加、删除、查询、优化等功能。
Jar 包位置
解压目录:
它是集成到solr压缩包里的,解压文件后,有个目录/dist/,里面就存放了solrj所用到的jar( /dist/solrj-lib/*.jar和 /dist/*.jar),把这些所有的jar都添加到项目中的classpath就可以直接开发了。

Demo示例如下(以上传GitHub https://github.com/LX1993728/SolrJ_java_Test)

Product.java

public class Product {
    //Field中的value要遵循核心中schema中<fields>的规则
    @Field(value="id")
    private String id;
    @Field(value="name")
    private String name;
    @Field(value="description")
    private String desc;
    @Field(value="price")
    private float price;
       // setter  getter
       // ......
}

@Field 表示 当前属性与索引库中哪个已经声明的字段名相对应 (具体规则由schema指定)

SolrDao.java (索引的增删改查)

package liuxun.solrj.dao;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import liuxun.solrj.bean.Product;
/**
 * 使用solrJ 向solr 提交请求,增删改查, solrJ 底层页是发送http 协议...
 * 
 * @author liuxun
 */
public class SolrDao {
    // 在solr 当中有一些默认的字段和动态字段规则,配置在文件/example/solr/collection1/conf/schema.xml
    // 添加默认索引属性
    public void addDefaultField() throws SolrServerException, IOException {
        // 声明要连接solr服务器的地址
        String url = "http://localhost:8983/solr";
        SolrServer solr = new HttpSolrServer(url);
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id", "默认情况下必须添加的字段,用来区分文档的唯一标识");
        doc.addField("name", "默认的名称属性字段");
        doc.addField("description", "默认的表示描述信息的字段");
        solr.add(doc);
        solr.commit();
    }
    // 添加动态索引属性
    public void addDynamicField() throws SolrServerException, IOException {
        // 声明要连接solr服务器的地址
        String url = "http://localhost:8983/solr";
        SolrServer solr = new HttpSolrServer(url);
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id", "adwweqwewe");
        doc.addField("nam_s", "动态字段的StringField类型格式为*_s");
        doc.addField("desc_s", "动态字段的TextField类型格式为*_t");
        solr.add(doc);
        solr.commit();
    }
    // 添加索引
    public void addIndex(Product product) throws SolrServerException, IOException {
        // 声明要连接solr服务器的地址
        String url = "http://localhost:8983/solr";
        SolrServer solr = new HttpSolrServer(url);
        solr.addBean(product);
        solr.commit();
    }
    // 更新索引
    public void updateIndex(Product product) throws IOException, SolrServerException {
        // 声明要连接solr服务器的地址
        String url = "http://localhost:8983/solr";
        SolrServer solr = new HttpSolrServer(url);
        solr.addBean(product);
        solr.commit();
    }
    // 删除索引
    public void delIndex(String id) throws SolrServerException, IOException {
        // 声明要连接solr服务器的地址
        String url = "http://localhost:8983/solr";
        SolrServer solr = new HttpSolrServer(url);
        solr.deleteById(id);
        // solr.deleteByQuery("id:*");
        solr.commit();
    }
    // 查找索引
    public void findIndex() throws SolrServerException {
        // 声明要连接solr服务器的地址
        String url = "http://localhost:8983/solr";
        SolrServer solr = new HttpSolrServer(url);
        // 查询条件
        SolrQuery solrParams = new SolrQuery();
        solrParams.setStart(0);
        solrParams.setRows(10);
        solrParams.setQuery("name:苹果 +description:全新4G");
        // 开启高亮
        solrParams.setHighlight(true);
        solrParams.setHighlightSimplePre("<font color='red'>");
        solrParams.setHighlightSimplePost("</font>");
        // 设置高亮的字段
        solrParams.setParam("hl.fl", "name,description");
        // SolrParams是SolrQuery的子类
        QueryResponse queryResponse = solr.query(solrParams);
        // (一)获取查询的结果集合
        SolrDocumentList solrDocumentList = queryResponse.getResults();
        // (二)获取高亮的结果集
        // 第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名
        Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
        for (SolrDocument solrDocument : solrDocumentList) {
            System.out.println("=====" + solrDocument.toString());
            Map<String, List<String>> fieldsMap = highlighting.get(solrDocument.get("id"));
            List<String> highname = fieldsMap.get("name");
            List<String> highdesc = fieldsMap.get("description");
            System.out.println("highname======" + highname);
            System.out.println("highdesc=====" + highdesc);
        }
        // (三) 将响应结果封装到Bean
        List<Product> products = queryResponse.getBeans(Product.class);
        System.out.println(products + "+++++++++++");
        for (Product product : products) {
            System.out.println(product);
        }
    }
}

 测试:

SolrDaoTest

package liuxun.solrj.junit;
import static org.junit.Assert.*;
import java.io.IOException;
import org.apache.solr.client.solrj.SolrServerException;
import org.junit.Before;
import org.junit.Test;
import liuxun.solrj.bean.Product;
import liuxun.solrj.dao.SolrDao;
public class SolrDaoTest {
    private SolrDao solrDao = new SolrDao();
    @Test
    public void testAddDefaultField() throws SolrServerException, IOException {
        solrDao.addDefaultField();
    }
    @Test
    public void testAddDynamicField() throws SolrServerException, IOException {
        solrDao.addDynamicField();
    }
    @Test
    public void testAddIndex() throws SolrServerException, IOException {
        for(int i=1;i<=2;i++){
            Product product=new Product();
            product.setId(String.valueOf(i));
            product.setName("苹果(Apple)iPhone 5c 16G版 3G手机(白色)电信版");
            product.setDesc("选择“购机送费版”北京用户享全新4G合约套餐资费全网最低!");
            product.setPrice(9f);
            solrDao.addIndex(product);
        }
    }
    @Test
    public void testUpdateIndex() throws IOException, SolrServerException {
        Product product=new Product();
        product.setId(String.valueOf(2));
        product.setName("毛衣的毛衣黑色毛衣");
        product.setDesc("女士专用 三点不漏..");
        product.setPrice(9f);
        solrDao.updateIndex(product);
    }
    @Test
    public void testDelIndex() throws SolrServerException, IOException {
        solrDao.delIndex("2");
    }
    @Test
    public void testFindIndex() throws SolrServerException {
        solrDao.findIndex();
    }
}
控制台打印:

 

在solr图形界面搜索: 

 

Solr安装插件与数据库表进行同步

修改solrconfig.xml,添加下面这段代码:

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">data-config.xml</str>
    </lst>
</requestHandler>

然后再solrconfig.xml文件统计的目录下新增上面声明的data-config.xml。内容如下:

<?xml version="1.0" encoding="UTF-8" ?>  
<dataConfig>   
<dataSource type="JdbcDataSource"   
          driver="com.mysql.jdbc.Driver"   
          url="jdbc:mysql://localhost:3306/solr_test"   
          user="root"   
          password="root"/>   
<document>   
    <entity name="id" query="select id,name,manu from solr" dataSource="JdbcDataSource"></entity>   
</document>   
</dataConfig>

因为需要连接数据库所以需要连接数据库的jar 包,以及操作索引库的jar 包,在collection 下面创建lib 目录将jar 包拷贝到lib 目录下 ( solr-dataimporthandler-4.7.0, solr-dataimporthandler-extras-4.7.0以及连接 mysql 的jar 包)

配置的目录如下

 测试导入:

查询是否导入成功 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西米先生「软件工程师」

您的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值