Solr配置中文分词器IKAnalyzer及增删改查调用

简介: 一、配置IKAnalyzer中文分词器Solr 版本5.2.1IKAnalyzer2012_u6.jar报错 ,用IKAnalyzer2012_FF_hf1.jar 替换可解决解决lucene4.0与IKAnalyzer的冲突。解决Exception in thread "main" java.lang.VerifyError: class org.wltea.analyzer.lu


一、配置IKAnalyzer中文分词器

Solr 版本5.2.1


IKAnalyzer2012_u6.jar报错 ,用IKAnalyzer2012_FF_hf1.jar 替换可解决

解决lucene4.0与IKAnalyzer的冲突。解决Exception in thread "main" java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides final method tokenStream.(Ljava/lang/String;Ljava/io/Reader;)Lorg/apache/lucene/analysis/TokenStream;原因IKAnalyzer中参考手册中的例子是使用的lucene3.4,与4.0已经是不兼容了。使用IKAnalyzer2012_FF_hf1.jar可以解决问题



java.lang.AbstractMethodError

Caused by: java.lang.AbstractMethodError
	at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:179)


lucene版本跟IK分词版本不一致导致,这块版本一定要对应上 

由于solr版本较高暂时无法解决


         <field name="messageId" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
        <field name="msg_title" type="text_ik" stored="true" indexed="true"/>
        <field name="msg_content" type="text_ik" stored="true" indexed="true" multiValued="true"/>
        <uniqueKey>messageId</uniqueKey>
        
           <!-- IKAnalyzer 中文分词-->
    <fieldType name="text_ik" class="solr.TextField">
       <analyzer type="index" class="org.wltea.analyzer.lucene.IKAnalyzer" />
       <analyzer type="query" class="org.wltea.analyzer.lucene.IKAnalyzer" />
    </fieldType>






二、添加、删除、查询索引

需要除了solr相关包还需要下面的jar包

wKioL1buVxjgfcciAAAXde9_L7Q195.png


Message.java

package org.itat.lucene.solr.test;

import org.apache.solr.client.solrj.beans.Field;

public class Message {
    
    

    private String messageId;
    private String title;
    private String[] content;
    
    
    public Message() {
        super();
    }

    public Message(String messageId, String title, String[] content) {
        super();
        this.messageId = messageId;
        this.title = title;
        this.content = content;
    }

    public String getMessageId() {
        return messageId;
    }

    @Field
    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }
    public String getTitle() {
        return title;
    }
    
    @Field("msg_title")
    public void setTitle(String title) {
        this.title = title;
    }
    public String[] getContent() {
        return content;
    }
    
    @Field("msg_content")
    public void setContent(String[] content) {
        this.content = content;
    }
}



增删改查demo

package org.itat.lucene.solr.test;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Before;
import org.junit.Test;

public class SolrTest {
    private final static String URL = "http://localhost:8080/solr/mail";
    private HttpSolrServer server = null;
    
    @Before
    public void init() {
        server = new HttpSolrServer(URL);
    }

    
    @Test
    public void addOneOrDelete() {
        
    /*HttpSolrServer server=new HttpSolrServer(URL);*/
    /*ConcurrentUpdateSolrServer cs=new ConcurrentUpdateSolrServer(URL,1,1);
     *新版已被ConcurrentUpdateSolrClient取代
     * */
    /*CloudSolrServer css=new CloudSolrServer("192.168.0.1");//zookeeper地址
     *已被CloudSolrClient
     */        
    
    HttpSolrClient server= new HttpSolrClient(URL);//新版已经取代了HttpSolrServer
    
        SolrInputDocument doc = new SolrInputDocument();
        //id是唯一的主键,当多次添加的时候,最后添加的相同id的域会覆盖前面的域
        doc.addField("messageId","3");
        doc.addField("msg_title", "这是我的第一个solrj的程序");
        doc.addField("msg_content","我的solrj的程序究竟能不能跑得起来呢?");
        try {
            UpdateResponse ur=server.add(doc);
            System.out.println(ur);
            
            /*server.deleteByQuery("*:*");*/
            server.commit(null,true,true,false);
                    server.close();
        } catch (SolrServerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    
    //一下添加多个
    @Test
    public void addList() {
        try {
            List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
            SolrInputDocument doc = new SolrInputDocument();
            doc.addField("messageId", "2");
            doc.addField("msg_title", "很好!solr可以工作了");
            doc.addField("msg_content","slor总算可以正式工作了");
            docs.add(doc);
            doc = new SolrInputDocument();
            doc.addField("messageId", "3");
            doc.addField("msg_title", "测试一下solr的添加");
            doc.addField("msg_content","看看能不能添加一个列表信息");
            docs.add(doc);
            server.add(docs);
            server.commit();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
    //基于java bean的添加
    @Test
    public void addBean() {
        try {
            List<Message> msgs = new ArrayList<Message>();
            msgs.add(new Message("4","基于java bean的添加",
                     new String[]{"通过java bean完成添加","java bean的添加附件"}));
            msgs.add(new Message("5","基于java bean的列表数据的添加",
                     new String[]{"测试如何通过一个对象完成添加","通过对象完成添加的附件"}));
            server.addBeans(msgs);
            server.commit();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //查询
    @Test
    public void test04() {
        try {
            //定义查询字符串
            SolrQuery query = new SolrQuery("*");
            query.setStart(0);
            query.setRows(5);
            QueryResponse resp=null;
            try {
                resp = server.query(query);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //查询出来的结果都保存在SolrDocumentList中
            SolrDocumentList sdl = resp.getResults();
            System.out.println(sdl.getNumFound());
            for(SolrDocument sd:sdl) {
//                System.out.println(sd);
                System.out.println(sd.getFieldValue("msg_title")+","+sd.getFieldValue("msg_content"));
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        }
    }
    
    
    //基于javabean查询
    @Test
    public void test05() {
        try {
            SolrQuery query = new SolrQuery("*");
            query.setStart(0);
            query.setRows(5);
            QueryResponse resp=null;
            try {
                resp = server.query(query);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //可以直接查询相应的bean对象,但是不是很常用,无法得到查询总条数
            List<Message> list = resp.getBeans(Message.class);
            System.out.println(list.size());
            for(Message msg:list) {
                System.out.println(msg.getTitle());
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        }
    }
    
    //高亮
    @Test
    public void test06() {
        try {
            SolrQuery query = new SolrQuery("msg_content:测试 OR msg_title:测试");
            query.setHighlight(true).setHighlightSimplePre("<span class='highligter'>")
                                .setHighlightSimplePost("</span>")
                                .setStart(0).setRows(5);
            query.setParam("hl.fl", "msg_title,msg_content");
            QueryResponse resp=null;
            try {
                resp = server.query(query);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //查询出来的结果都保存在SolrDocumentList中
            SolrDocumentList sdl = resp.getResults();
            System.out.println(sdl.getNumFound());
            for(SolrDocument sd:sdl) {
                String id = (String)sd.getFieldValue("messageId");
                System.out.println(resp.getHighlighting().get(id).get("msg_content"));
                //高亮结果以唯一索引为key
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        }
    }
}



本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1753167

目录
相关文章
|
6天前
|
SQL 关系型数据库 分布式数据库
PolarDB Proxy配置与优化:提升数据库访问效率
【9月更文挑战第6天】PolarDB是阿里云推出的高性能分布式关系型数据库,PolarDB Proxy作为其关键组件,位于客户端与PolarDB集群间,负责SQL请求的解析与转发,并支持连接池管理、SQL过滤及路由规则等功能。本文详细介绍了PolarDB Proxy的配置方法,包括连接池、负载均衡和SQL过滤设置,并探讨了监控调优、缓存及网络优化策略,以帮助提升数据库访问效率。
15 1
|
11天前
|
Java 数据库连接 数据库
数据库以及其他项目配置
该项目配置了数据库连接和MyBatis设置,并解决了配置文件加载问题。启动类使用 `@SpringBootApplication` 注解,可通过 `@ComponentScan` 指定扫描包。Lombok 自动生成 getter/setter 等方法,简化代码。Result 实体类用于统一返回格式。用户模块包括注册与登录功能,使用 MD5 加密密码、Spring Validation 参数校验及 JWT 认证。JWT 工具类处理令牌生成与解析,并通过拦截器验证。Redis 优化登录功能,利用 ThreadLocal 存储用户信息。此外,还包括文章模块的相关功能,如文章分类管理、
30 2
|
20天前
|
关系型数据库 MySQL Linux
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
|
14天前
|
关系型数据库 MySQL 机器人
Django入门到放弃之数据库配置
Django入门到放弃之数据库配置
|
14天前
|
开发工具 数据安全/隐私保护 索引
LDAP学习笔记之二:389-DS(RHDS) 增删改查基本操作
LDAP学习笔记之二:389-DS(RHDS) 增删改查基本操作
|
14天前
|
关系型数据库 MySQL 数据库
MySQL数据库的增删改查
MySQL数据库的增删改查
11 0
|
18天前
|
开发框架 .NET 关系型数据库
【Azure 应用服务】App Service 通过门户配置数据库连接字符串不生效 
【Azure 应用服务】App Service 通过门户配置数据库连接字符串不生效 
|
21天前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
90 2
|
16天前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~