首页 > 其他分享 >solr基础

solr基础

时间:2023-08-01 12:33:07浏览次数:40  
标签:sQuery 高亮 Solr 基础 索引 创建 solr


简介

   介绍Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。


   使用目的:让你的系统查询更给力 更高效。

   搭建环境:

1. JDK 1.6 ;

2. Tomcat 6;

3. Solr 3.6;

   搭建步骤:

   1.tomcat 和solr放到windows 下 D盘(随便放,我是放D盘了)先打开tomcat server.xml修改下请求配置

 

<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000"   redirectPort="8443"URIEncoding="UTF-8"/> 防止URL乱码 Solr请求是get方式。

2. 在apache-solr-3.6.0\dist目录下找到apache-solr-3.6.0.war把重命名为solr.war 并放到 tomcat/webapps下

3.在conf/Catalina/localhost文件夹下 创建solr.xml

 

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

   <Context docBase="D:/apache-tomcat-6.0.35/webapps/solr" debug="0" crossContext="true" >

 

      <Environment name="solr/home" type="java.lang.String" value="D:/solr" override="true" />  

   </Context>

  4.把apache-solr-3.6.0\example目录下的solr文件夹上传到D:/solr目录下.索引文件会默认会放到 tomca\solr\data下.

       这里打D:/solr/conf/sorlConfig.xml

       找到-><dataDir>${solr.data.dir:D:/solr/data}</dataDir> 把solr.data.dir改成 D:/solr路径

  5.重启tomcat 打开   http://localhost/solr/  会看到Welcome to Solr ! 部署Solr服务器成功

 

 

 

 

solr 3.5与IKAnalyzer 3.2.8分词的整合

 

  1.下载IKAnalyzer  

       http://ik-analyzer.googlecode.com/files/IKAnalyzer3.2.8%20bin.zip

  2.添加IKAnalyzer3.2.8.jar

        把IKAnalyzer3.2.8.jar放到 tomcat\webapps\solr\WEB-INF\lib下;

  3.Schema.xml 增加信息

   进入目录编辑schema.xml文件,在<Types>下添加以下内容: (在D:/solr/conf下)    配置分词fieldType类型

<!-- ik-->
<fieldType name="text" class="solr.TextField" >    
              <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>    
              <analyzer type="index">    
                  <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>    
                  <filter class="solr.StopFilterFactory"    
                          ignoreCase="true" words="stopwords.txt"/>    
                  <filter class="solr.WordDelimiterFilterFactory"    
                          generateWordParts="1"    
                          generateNumberParts="1"    
                          catenateWords="1"    
                          catenateNumbers="1"    
                          catenateAll="0"    
                          splitOnCaseChange="1"/>    
                  <filter class="solr.LowerCaseFilterFactory"/>    
                  <filter class="solr.EnglishPorterFilterFactory"    
                      protected="protwords.txt"/>    
                  <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>    
              </analyzer>    
                <analyzer type="query">    
                  <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>    
                  <filter class="solr.StopFilterFactory"    
                          ignoreCase="true" words="stopwords.txt"/>    
                  <filter class="solr.WordDelimiterFilterFactory"    
                          generateWordParts="1"    
                          generateNumberParts="1"    
                          catenateWords="1"    
                          catenateNumbers="1"    
                          catenateAll="0"    
                          splitOnCaseChange="1"/>    
                  <filter class="solr.LowerCaseFilterFactory"/>    
                  <filter class="solr.EnglishPorterFilterFactory"    
                      protected="protwords.txt"/>    
                  <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>    
              </analyzer>    
</fieldType>

4.然后在<fields>下添加

<field name="name1" type="text" indexed="true" stored="true" required="true"/>    

  5.重新tomcat 在浏览器中输入: http://localhost/solr/analysis.jsp ; 进去 solr admin 显示:

 

 

 

 

 

客户端开发 Solrj

   Solr是搭建好的lucene服务器 当然不可能完全满足一般的业务需求 可能 要针对各种的架构和业务调整 这里就需要用到Solrj了

Solrj是Solr提供的api库 可以进行Solr 的二次开发。

   主要实现原理 服务端利用httpClient发送Solr格式的HTTP请求 到Solr服务器  然后服务器根据请求去找索引( 当然你要先针对数据源创建索引)最后返回SolrDocument. 然后你再进一步处理 高亮 排序 等功能。

 1. 创建连接

      

   //这里创建的一个HTTP请求 用的4.1的JAR Solr3.6之前用的CommonHttpSolrServer.新版改成这个类了 创建一个单例服务。

 2. 创建索引

/***
* 创建Solr索引 通过指定的实体
    */
public void create(T t) {
SolrEntityBinder binder = new SolrEntityBinder();//这里这个类是源码DocumentObjectBinder处理类 这里为了实体转换改写了里面一些判断后面会讲到 剩下没改过
SolrInputDocument doc = binder.toSolrInputDocument(t); //把你的实体对象转换成Solr输入文档对象
try {
solrServer.add(doc);//添加文档
solrServer.commit();//提交请求
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

  3 .删除索引

/**
* 删除指定ID的索引
*/
public void delete(PK id) {
try {
solrServer.deleteById((String)id );//直接根据ID删除 solrServer.deleteByQuery("*:*");删除所有   
solrServer.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

  4.修改索引

   直接先删除后创建

  5.查询索引

 

String id = null;
try {
HttpSolrServer server = SolrServiceConfiger.getInstance().getServer();// 创建服务 */
SolrQuery sQuery = new SolrQuery();  // 创建solr查询对象
String para="";  
if(StringUtils.isNotEmpty(content)){ // 拼接solr查询条件
para ="company:"+content;
}
if(!StringUtils.isNotEmpty(para)){  
para="*:*";   
}
sQuery.setQuery(para)
.setStart((page.getPageNo()-1)*page.getPageSize())
.setRows(page.getPageSize());  
//设置高亮  
       sQuery.setHighlight(true); // 开启高亮组件  
       sQuery.addHighlightField("company");// 高亮字段  
       sQuery.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀  
       sQuery.setHighlightSimplePost("</font>");//后缀  
       sQuery.setHighlightSnippets(2);//结果分片数,默认为1  
       sQuery.setHighlightFragsize(1000);//每个分片的最大长度,默认为100  
       sQuery.setFacet(true).setFacetMinCount(1)
                       .setFacetLimit(5)//段  
              .addFacetField("company");//分片字段  
         //返回结果
       QueryResponse response = server.query(sQuery);  
         //得到文档列表
       SolrDocumentList list = response.getResults();  
        //得到总数 设置
                Integer counts=(int) list.getNumFound();               
       page.setTotalCount(counts);
       //得到高亮数据
       Map<String,Map<String,List<String>>> highlightMap=response.getHighlighting(); //得到高亮集合
        //创建对象转换对象
       DocumentObjectBinder binder = new DocumentObjectBinder();  
        //转换对象
       List<Demo> demoList= binder.getBeans(Demo.class, list);
        //设置高亮结果
       for(Demo d :demoList){
       id = d.getId();
       List<String> companyList = highlightMap.get(id).get("company");         
       if(companyList!=null&&companyList.size()>0){
       d.setCompany(companyList.get(0));
       }        
       }
       //返回结果
       page.setResult(demoList);
      
} catch (Exception e) {
e.printStackTrace();
}  
          return page;
}

常见问题

 

1. org.apache.solr.client.solrj.SolrServerException:

   Timeout occured while waiting response from server at: http://localhost/solr请求超时

解决方法:设置setConnectionTimeout和setSoTimeout为1分钟

2. org.apache.solr.common.SolrException: undefined field text

解决方法: 设置solrConfig.xml <str name="df">id</str> 默认是text

 

3. org.apache.solr.common.SolrException: Invalid Date String时间格式化问题

主要是Solr使用的是标准的格林威治(GMT)时间 这种(yyyy-MM-dd'T'HH:mm:ss.SSS'Z')北京在东八区 默认时间会-8小时

所以为了满足他这个减8 我的做法是在创建索引格式化日期类型的时候 判断下 把它时间+8 。

所以重新创建一个SolrEntityBinder类 此类是完全copy的DocumentObjectBinder. 只修改了一处。

修改了类中toSolrInputDocument方法

//判断是否是日期-------------///
if(field.type==Date.class){
Date d = (Date)field.get(obj);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(d.getTime());
cal.add(Calendar.HOUR, 8);
d = cal.getTime();
doc.setField(field.name,d,1.0f);
}else{
doc.setField(field.name, field.get(obj), 1.0f);
}

标签:sQuery,高亮,Solr,基础,索引,创建,solr
From: https://blog.51cto.com/u_16161240/6919592

相关文章

  • python教程 入门学习笔记 第3天 编程基础常识 代码注释 变量与常量
    编程基础常识一、注释1、对代码的说明与解释,它不会被编译执行,也不会显示在编译结果中2、注释分为:单行注释和多行注释3、用#号开始,例如:#这是我的第一个python程序4、注释可以写在单独一行,也可以写在一句代码后面5、不想执行编译,又不能删除的代码,可以先用#注释掉,代码批量注释......
  • Linux——vim编辑器的基础操作
    vim编辑器的基础操作在Vim编辑器中有很多快捷操作,下面列出一些常用的快捷键和操作:插入和编辑文本:-`i`:在当前光标处插入文本。-`a`:在当前光标后插入文本。-`o`:在当前行下方新建一行,并在新行中插入文本。-`O`:在当前行上方新建一行,并在新行中插入文本。-`yy`或`Y`:复制......
  • Redis 基础
    1.Redis入门1.1Redis简介Redis是一个基于内存的key-value结构数据库。Redis是互联网技术领域使用最为广泛的存储中间件。官网:https://redis.io中文网:https://www.redis.net.cn/key-value结构存储:主要特点:基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻......
  • JavaScript基础01
    javaScript作用1.嵌入动态文本于HTML页面。2.对浏览器事件做出响应。3.读写HTML元素。4.在数据被提交到服务器之前验证数据。5.检测访客的浏览器信息。控制cookies,包括创建和修改等。6.基于Node.js技术进行服务器端编程。js主要的内容ECMAScript语法变量......
  • 题型介绍与计算机基础
    CSP-J1题型均为选择题,满分100分,时长2小时。单项选择题概念题数学(如排列组合)阅读程序求输出阅读程序题是否正常运行输入->输出(特征)输出->输入(特征)程序的变量变化情况(循环执行次数)求解代码时间复杂度完善程序题代码类型的完形填空计算机的基础概......
  • Java基础2
    面向对象基础面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。对象实体与对象引用new运算符,new创建对象实例(对象实例在内存中),对象引用指向对象实例(对象引用存放在栈内存中)。关于相等......
  • Java基础1
    基础概念Java特点面向对象:继承,封装(把数据和操作数据的方法捆绑在一起,比如setName和getName),多态(多态是指一个引用变量到底会调用哪个类的方法,由具体的类型决定。一个变量如果声明为父类的类型,但实际引用的是子类的对象,那么该变量可以调用父类的所有方法,也可以调用子类重写父类的......
  • Python基础day56 Django URL分组设置
    URL函数的使用(支持正则表达式)#django1中使用的是urlurl('test',views.test),url函数的第一个参数是支持正则表达式的如果匹配到一个路由,就不在往下匹配,直接执行路由对应的视图函数#http://127.0.0.1:8000/test/是django默认设置的,django会先拿着test去匹配,如果匹配不......
  • 《面试1v1》ElasticSearch基础
    我是javapub,一名Markdown程序员从......
  • linux 3网络基础 tcp状态和多路IO
    1.tcp状态概念图![tcp状态](I:\网络基础3day\tcp状态.png)简化图![tcp状态简化图](I:\网络基础3day\tcp状态简化图.png)简化图未考虑特殊情况netstat命令(了解)2.半关闭状态半关闭主动方不可以在应用层发送数据,但是可以读数据FINWAIT2阶段![半关闭](I:\网络基础3......