设为首页 收藏本站
查看: 1441|回复: 0

[经验分享] Solr 6.6两种方式创建索引并插入数据(二)

[复制链接]

尚未签到

发表于 2017-12-19 17:41:29 | 显示全部楼层 |阅读模式
  solr环境的搭建请参考:http://www.cnblogs.com/xiao-zhang-blogs/p/7327814.html


  • 1.        Solr不支持搜索中文,办法总会有的,添加中文分词器。中文分词器有:IKAnalyzermmseg4j
a)         中文分词指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。

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

代码:

  

package demo;  

  

import java.io.IOException;  

import java.io.StringReader;  

import java.util.HashMap;  

import java.util.Iterator;  

import java.util.Map;  

  

import org.wltea.analyzer.core.IKSegmenter;  

import org.wltea.analyzer.core.Lexeme;  

  

public>public static void main(String[] args) throws IOException {  String text
= "我爱你中国,厉害了,我的国。我爱你!";int topWordsCount=4;  Map
<String,Integer> wordsFrenMaps=getTextDef(text);  sortSegmentResult(wordsFrenMaps,topWordsCount);
  }
public static Map getTextDef(String text) throws IOException {  Map
<String, Integer> wordsFren=new HashMap<String, Integer>();  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);  }
  }
  }
return wordsFren;  }
public static void sortSegmentResult(Map<String,Integer> wordsFrenMaps,int topWordsCount){  Iterator
<Map.Entry<String,Integer>> wordsFrenMapsIterator=wordsFrenMaps.entrySet().iterator();while (wordsFrenMapsIterator.hasNext()){  Map.Entry
<String,Integer> wordsFrenEntry=wordsFrenMapsIterator.next();  System.out.println(wordsFrenEntry.getKey()
+"       的次数为"+wordsFrenEntry.getValue());  }
  }
  
}
  


        效果:

            DSC0000.png

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



  • 2.        创建core数据来源一共有三种情况,分别是:1、通过java直接写入。2、直接配置数据源。
a)         E:\solrhome目录下创建一个文件夹helloworld,将solr-6.6.0\example\example-DIH\solr\db文件夹下的conf文件夹赋值到helloworld文件夹下,如下图:

DSC0001.png

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

DSC0002.png

成功后:

DSC0003.png

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

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

代码如下:

  

package test;  

  

import java.io.IOException;  

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.HttpSolrClient;  

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 org.apache.solr.common.util.NamedList;  

  

public>//solr的服务器地址  private final static String SOLR_URL = "http://localhost:8080/solr/";
  /**
  * 往索引库添加文档
  * @throws IOException
  * @throws SolrServerException
  */
  public void addDoc() throws SolrServerException, 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 = new SolrInputDocument();  
  //往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
  document.addField("id", "1");  
  document.addField("name", "你好");  
  document.addField("description", "前进的中国你好");  
  solr.add(document);
  solr.commit();
  } finally{
  solr.close();
  }
  }
  /**
  * 根据id从索引库删除文档
  */
  public void deleteDocumentById() throws Exception {  
  //选择具体的某一个solr core
  HttpSolrClient server = new HttpSolrClient(SOLR_URL+"helloworld");
  //删除文档  
  
//        server.deleteById("3");
  //删除所有的索引
  server.deleteByQuery("*:*");
  //提交修改  
  
        server.commit();
  server.close();
  }  
  /**
  * 查询
  * @throws Exception
  */
  public void querySolr() throws Exception{
  HttpSolrClient solrServer = new HttpSolrClient(SOLR_URL+"helloworld");  
  SolrQuery query = new SolrQuery();
  
//        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("<font color='red'>");  
  query.setHighlightSimplePost("</font>");
  

  //获取查询结果
  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"));
  }
  

  }
  

  
}
  


效果如下:

DSC0004.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.<init>(Lcom/chenlb/mmseg4j/Seg;)V错误信息,原因是:mmseg4j-solr已经包含了mmseg4j-analysis)

DSC0005.png

DSC0006.png



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

DSC0007.png

添加中文分词器:

首先mmseg4j有三种分词方式:

  

<!-- mmseg4j的三种分词方式-->  

  
<fieldtype name="textComplex" positionIncrementGap="100">
  

  <analyzer>
  

  <tokenizer mode="complex" dicPath="/dic"/>
  

  </analyzer>
  

  </fieldtype>
  

  <fieldtype name="textMaxWord" positionIncrementGap="100">
  

  <analyzer>
  

  <tokenizer mode="max-word" />
  

  </analyzer>
  

  </fieldtype>
  

  <fieldtype name="textSimple" positionIncrementGap="100">
  

  <analyzer>
  

  <tokenizer mode="simple" dicPath="G:\ymy\solr\solr-5.4.1\server\solr\good\dic" />
  

  </analyzer>
  

  </fieldtype>
  

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

DSC0008.png

DSC0009.png

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

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

DSC00010.png

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

DSC00011.png

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


  

<field name="name" type="string" indexed="true" stored="true"/>  

  
<field name="author" type="string" indexed="true" stored="true"/>
  

  
<field name="summary" type="string" indexed="true" stored="true"/>
  

  
<field name="count" type="int" indexed="true" stored="true"/>
  

                                     配置数据库映射:

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

                                     文件内容:

  

  <?xml version="1.0" encoding="UTF-8"?>  

  
<dataConfig>
  

  
<dataSource name="source" type="JdbcDataSource" driver="oracle.jdbc.driver.OracleDriver"
  url="jdbc:oracle:thin:@localhost:1521:orcl"
  
        user="scott" password="tiger"/>
  
   <document name="mydemo">         
  

  
  <entity name="mydemo" pk="id"  dataSource="source" query="select * from books" transformer="ClobTransformer">                  
  
    <field column="id" name="id" />
  
    <field column="name" name="name" />
  
     <field column="author" name="author"/>
  
     <field column="summary" name="summary" />
  
     <field column="count" name="count"/>
  </entity>
  
</document>
  

  
</dataConfig>
  


DSC00012.png

接着在E:\solrhome\helloworld\conf的solrconfig.xml配置文件中的<requestHandler name="/select">(743行)上面添加


  

<requestHandler name="/dataimport">  

  <lst name="defaults">
  
      <str name="config">data-config.xml</str>
  
      </lst>
  

  </requestHandler>
  

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

DSC00013.png

接着,查询全部:

DSC00014.png

  数据成功导入。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-425771-1-1.html 上篇帖子: 【转】 Solr的SolrCloud与Master-slave主从模式对比 下篇帖子: Solr 6.7学习笔记(03)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表