solr系列1——solr入门

作者: 逐暗者 | 来源:发表于2016-04-26 16:41 被阅读1650次

    solr 搭建(基于4.10.3) 结合 Tomcat ,java 操作 solr

    • 下载solr包

      http://archive.apache.org/dist/lucene/solr

    • 安装solr
      • 解压solr

        tar -zxvf solr-4.10.3.tgz.tar -C /usr/local/

      • 重命名solr( 可选 )

        mv solr-4.10.3 solr

      • 上传tomcat,解压

        tar -zxvf apache-tomcat-7.0.68.tar.gz -C /usr/local/
        mv apache-tomcat-7.0.68 tomcat

      • solr与tomcat集成
        • solr/example/webapps 中的solr.war拷贝到tomcat/webapps/

          cp solr.war /usr/local/tomcat/webapps
          - 进入tomcat/webapps解压solr.war
          > cd /usr/local/tomcat/webapps && mkdir solr && unzip solr.war -d solr && rm -rf solr.war
          - 修改solr/WEB-INF/web.xml文件中的nv-entry标签的solr/home地址为/usr/local/solr/example/solr,保存退出
          > vim solr/WEB-INF/web.xml
          >
          > 修改参数:
          > xml <env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>/usr/local/solr/example/solr</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
          - 拷贝相关jar到tomcat
          > cd /usr/local/solr/example/lib/ext && cp * /usr/local/tomcat/lib/
          - 启动tomcat
          > ./catalina.sh start
          - 查看日志( 可选
          > tail -f -n 500 /usr/local/tomcat/logs/catalina.out
          - 通过浏览器访问solr管控台
          > http://ip:8080/solr ,注意关闭防火墙(service iptables stop)
          >

          solr管控台.png
      • 完毕

    • solr 结合 java
      • 引入jar
        <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-solrj</artifactId>
        <version>4.10.3</version>
        </dependency>
      • 使用java添加数据到solr
        • 实体bean中,在需要搜索条件上加@Field注解(通过addBean方式提交),添加@Field,solr才会对该字段的值进行分词添加索引

          代码如下:

          @Data
          public class User {
          private int id;
          @Field("name")
          private String name;
          private int price;
          private String url;
          }
        • 同时到/usr/local/solr/example/solr/collection1/conf中,在schema.xml添加需要搜索的field,对应实体注解@Field(通过addBean方式提交)字段,

          vim /usr/local/solr/example/solr/collection1/conf/schema.xml

          比如:

          <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
          <field name="sku" type="text_en_splitting_tight" indexed="true" stored="true" omitNorms="true"/>
          <field name="name" type="text_general" indexed="true" stored="true"/>
          <field name="manu" type="text_general" indexed="true" stored="true" omitNorms="true"/>
          <field name="cat" type="string" indexed="true" stored="true" multiValued="true"/>
          <field name="features" type="text_general" indexed="true" stored="true" multiValued="true"/>
          ```xml
          name : 搜索字段名 type :分词类型(String\date等等)   indexed : 是否被索引   stored : 是否被储存  multiValued : 是否存储多个值 required : 是否必须字段
          
          注意:以上field只是例子,solr自身提供的schema.xml已经存在field,如果需要自定义,可自行添加
        • 通过SolrServer添加数据到solr

          代码如下:

          //方式一
          private static final String URL = "http://192.168.58.144:8080/solr";//solr操作url
          @Resource
          private IUserService userService;
          @Test
          public void addField() throws IOException, SolrServerException {
          List<User> list = userService.list();
          //实例化solr对象
          SolrServer server = new HttpSolrServer(URL);
          SolrInputDocument document = null;
          for (User u : list) {
          //实例化数据加载类
          document = new SolrInputDocument();
          document.addField("id",u.getId());
          document.addField("name",u.getName());
          document.addField("price",u.getPrice());
          document.addField("url",u.getUrl());
          server.add(document);
          }
          server.commit();//提交数据
          }
          **注意:`document.addField(key,value); key`对应`schema.xml`中必须存在`name`的值为`key`的`field`,否则将报错;`value`则为对应的值**
          > ```java
               //方式二
               @Test
               public void addField2() throws IOException, SolrServerException {
                   List<User> list = userService.list();
                   //实例化solr对象
                   SolrServer server = new HttpSolrServer(URL);
                   //实例化数据加载类
                   for (User u : list) {
                       //直接添加实体对象
                       server.addBean(u);
                   }
                   server.commit();
               }
          
          注意:方式二必须要在实体bean中的属性加上@Field注解,才能生效,否则报错
        • 通过SolrServer搜索

          代码如下:

          @Test
          public void searchField() throws SolrServerException {
          SolrServer server = new HttpSolrServer(URL);
          //查询类
          SolrQuery query = new SolrQuery();
          //查询条件
          query.set("q", "name:黎 AND price:{15 TO 25}");//AND 分隔
          //query.addFilterQuery("id:1");//AND 分隔
          query.set("fl", "id,name");//返回字段值,不返回则为null
          query.setSort("price", SolrQuery.ORDER.asc);
          query.setHighlight(true); //开启高亮
          query.setHighlightFragsize(10); //返回的字符个数
          query.setHighlightRequireFieldMatch(true);
          query.setHighlightSimplePre("<font color="red">"); //前缀
          query.setHighlightSimplePost("</font>"); //后缀
          query.setParam("hl.fl", "name"); //高亮字段
          query.setStart(0);
          query.setRows(10);
          //查询数据
          QueryResponse response = server.query(query);
          Map<String, Map<String, List<String>>> maps = response.getHighlighting();//获取高亮信息
          //数据结果
          SolrDocumentList list = response.getResults();
          for (SolrDocument doc : list){
          System.out.println("--------------------");
          System.out.println("|--" + doc.getFieldValue("id"));
          System.out.println("|--" + doc.getFieldValue("name"));
          System.out.println("|--" + doc.getFieldValue("price"));
          System.out.println("|--" + doc.getFieldValue("url"));
          System.out.println("|--" + maps.get(doc.getFieldValue("id").toString()));//高亮信息 高亮信息返回方式 id:value
          System.out.println("--------------------");
          }
          部分查询参数解析:
          ```xml
          - q : 查询字符串,必须项,一个或多个field
          - fq(filter query) : 过滤查询,0个或多个field
          - sort : 排序(asc、desc),默认相关性降序
          - start,rows : 分页(指定从多少开始获取多少条记录)
          - fl : 指定返回哪些字段内容
          - wt : 指定输出格式,可以是xml、json等
          - hl.fl :表示高亮的field,也就是高亮的区域
          
          注意:qfq 的区别,两者都为查询,但是q为全局查询;fq为过滤,即对q的结果进行过滤,强调效率性能,但是不要在两者都添加对同一field进行查询,这样反而降低查询效率,增加查询性能开销。
        • 删除solr数据

          代码如下:

          @Test
          public void deleteField() throws IOException, SolrServerException {
          SolrServer server = new HttpSolrServer(URL);
          server.deleteById("1");
          server.commit();
          }
          
          以上是基于solrj方式对solr进行操作。可参考[solr-wiki文档api](http://wiki.apache.org/solr/FrontPage)
          
          
          

    作者:逐暗者 (转载请注明出处)

    相关文章

      网友评论

        本文标题:solr系列1——solr入门

        本文链接:https://www.haomeiwen.com/subject/eqoqrttx.html