solr java 导入数据_Solr 6.6两种方式创建索引并插入数据(二)

solr环境的搭建请参考:http://www.cnblogs.com/xiao-zhang-blogs/p/7327814.html

1.Solr不支持搜索中文,办法总会有的,添加中文分词器。中文分词器有:IKAnalyzer,mmseg4j等

a)中文分词指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。

b)写个程序看一下效果。(IKAnalyzer)

代码:

packagedemo;importjava.io.IOException;importjava.io.StringReader;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importorg.wltea.analyzer.core.IKSegmenter;importorg.wltea.analyzer.core.Lexeme;public classTest {public static void main(String[] args) throwsIOException {

String text= "我爱你中国,厉害了,我的国。我爱你!";int topWordsCount=4;

Map wordsFrenMaps=getTextDef(text);

sortSegmentResult(wordsFrenMaps,topWordsCount);

}public static Map getTextDef(String text) throwsIOException {

Map wordsFren=new HashMap();

IKSegmenter ikSegmenter= new IKSegmenter(new StringReader(text), true);

Lexeme lexeme;while ((lexeme = ikSegmenter.next()) != null) {if(lexeme.getLexemeText().length()>1){if(wordsFren.containsKey(lexeme.getLexemeText())){

wordsFren.put(lexeme.getLexemeText(),wordsFren.get(lexeme.getLexemeText())+1);

}else{

wordsFren.put(lexeme.getLexemeText(),1);

}

}

}returnwordsFren;

}public static void sortSegmentResult(Map wordsFrenMaps,inttopWordsCount){

Iterator> wordsFrenMapsIterator=wordsFrenMaps.entrySet().iterator();while(wordsFrenMapsIterator.hasNext()){

Map.Entry wordsFrenEntry=wordsFrenMapsIterator.next();

System.out.println(wordsFrenEntry.getKey()+" 的次数为"+wordsFrenEntry.getValue());

}

}

}

效果:

4339dd0404d69f818e74d8fe439ed689.png

在步骤1.2中教大家如何将中文分词器添加到solr中。

2.创建core数据来源一共有三种情况,分别是:1、通过java直接写入。2、直接配置数据源。

a)在E:\solrhome目录下创建一个文件夹helloworld,将solr-6.6.0\example\example-DIH\solr\db文件夹下的conf文件夹赋值到helloworld文件夹下,如下图:

58b22ae07a89782fe5db989f4e076e37.png

b)在solr的管理界面点击Core Admin,点击Add Core,输入name值为helloworld,instanceDir值为helloworld,其他项不用改。注意:填写的值必须为我们创建的文件夹的名称,否则报错。最后Add Core。

8ff83ca54ed043b48c17351669287682.png

成功后:

a6e5272f504cfaea81d89d1f9e24d739.png

c)接下来,我们就在创建好的core中去写入数据。

i.              第一种,直接通过java程序写入。

代码如下:

packagetest;importjava.io.IOException;importjava.util.List;importorg.apache.solr.client.solrj.SolrQuery;importorg.apache.solr.client.solrj.SolrServerException;importorg.apache.solr.client.solrj.impl.HttpSolrClient;importorg.apache.solr.client.solrj.response.QueryResponse;importorg.apache.solr.common.SolrDocument;importorg.apache.solr.common.SolrDocumentList;importorg.apache.solr.common.SolrInputDocument;importorg.apache.solr.common.util.NamedList;public classTestSolr {//solr的服务器地址

private final static String SOLR_URL = "http://localhost:8080/solr/";/*** 往索引库添加文档

*@throwsIOException

*@throwsSolrServerException*/

public void addDoc() throwsSolrServerException, IOException{//获得一个solr服务端的请求,去提交 ,选择具体的某一个solr core//solr的服务器地址//private final static String SOLR_URL = "http://localhost:8080/solr/";

HttpSolrClient solr= new HttpSolrClient(SOLR_URL + "helloworld");try{//构造一篇文档

SolrInputDocument document = newSolrInputDocument();//往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义

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

document.addField("name", "你好");

document.addField("description", "前进的中国你好");

solr.add(document);

solr.commit();

}finally{

solr.close();

}

}/*** 根据id从索引库删除文档*/

public void deleteDocumentById() throwsException {//选择具体的某一个solr core

HttpSolrClient server = new HttpSolrClient(SOLR_URL+"helloworld");//删除文档//server.deleteById("3");//删除所有的索引

server.deleteByQuery("*:*");//提交修改

server.commit();

server.close();

}/*** 查询

*@throwsException*/

public void querySolr() throwsException{

HttpSolrClient solrServer= new HttpSolrClient(SOLR_URL+"helloworld");

SolrQuery query= newSolrQuery();//String temp = "name:文 OR description:你";//query.setQuery(temp);//下面设置solr查询参数//query.set("q", "*:*");//参数q 查询所有

query.set("q","好");//相关查询,比如某条数据某个字段含有某个字 将会查询出来 ,这个作用适用于联想查询//参数fq, 给query增加过滤查询条件

query.addFilterQuery("id:[0 TO 9]");//id为0-9//参数df,给query设置默认搜索域

query.set("df", "name");//参数sort,设置返回结果的排序规则

query.setSort("id",SolrQuery.ORDER.desc);//设置分页参数

query.setStart(0);

query.setRows(10);//每一页多少值//参数hl,设置高亮

query.setHighlight(true);//设置高亮的字段

query.addHighlightField("name");//设置高亮的样式

query.setHighlightSimplePre("");

query.setHighlightSimplePost("");//获取查询结果

QueryResponse response =solrServer.query(query);//两种结果获取:得到文档集合或者实体对象//查询得到文档的集合

SolrDocumentList solrDocumentList =response.getResults();//NamedList,一个有序的name/value容器,NamedList不像Map

NamedList list = (NamedList) response.getResponse().get("highlighting");

System.out.println(list);

System.out.println("查询的结果");

System.out.println("总数量:" +solrDocumentList.getNumFound());//遍历列表

for(SolrDocument doc : solrDocumentList) {

System.out.println("id:"+doc.get("id")+" name:"+doc.get("name")+" description:"+doc.get("description"));

}

}

}

效果如下:

89f2dfb7676c0ce218b126afffcfe8c3.png

ii.直接配置数据源(结构化数据存储)

如何将中文分词器加入到solr中

先下载mmseg4j的jar包,一共有三个,分别是:mmseg4j-analysis-1.9.1.jar、mmseg4j-core-1.10.0.jar和mmseg4j-solr-2.4.0.jar。

将mmseg4j-core-1.10.0.jar和mmseg4j-solr-2.4.0.jar放在apache-tomcat-8.0.32\webapps\solr\WEB-INF\lib目录下。

(注意:不要将包mmseg4j-analysis-1.9.1.jar放到改目录下,否则会报:java.lang.NoSuchMethodError: com.chenlb.mmseg4j.analysis.MMSegTokenizer.(Lcom/chenlb/mmseg4j/Seg;)V错误信息,原因是:mmseg4j-solr已经包含了mmseg4j-analysis)

bcd7bee6c3ea41f74c7aa255ae63262c.png

18785abc02cf305737a48f6ba7fdb4eb.png

在core去配置。

没有加入中文分词器的效果,无论你选择哪种类型,得到的结果如下:

4dd889918e80a18ad55e927bc951247e.png

添加中文分词器:

首先mmseg4j有三种分词方式:

把这些添加到E:\solrhome\helloworld\conf的managed-schema文件的325行左右。

e98e1cd25d2359b00938bdbef360f1ee.png

545fb17e504051c3b7a922dd7c26d40b.png

这个文件里面的field 标签里name存放的就是你所要分词的名称,type 放的是分词的类型。这里我把name=”title” 的type改为textComplex。(在148行)

重启tomcat,看一下效果(成功):

4f0204460a19e9e223e9a7b2fdbfa170.png

然后配置oracle数据源,这里我选用的表为books表

f4af2a75c341ccd0d35f40d97fcbf94f.png

在managed-schema去添加字段类型和名称(author和name配置文件中有,修改一下type即可,id配置文件中也有,127行)

配置数据库映射:

首先,在E:\solrhome\helloworld\conf创建一个data-config.xml文件

文件内容:

99edb291b77759b335e6167993bad440.png

接着在E:\solrhome\helloworld\conf的solrconfig.xml配置文件中的(743行)上面添加

data-config.xml

将数据从数据库导入到helloworld的core中,如下图:

8bec1ee572e9080143a2cebc5073a4af.png

接着,查询全部:

fe07755adac9bad0e99c7260ed4817f7.png

数据成功导入。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值