solr全文检索(多字段搜索)
1. Solr的目录介绍
dist: solr部署的war包,solrJ客户端
example\solr: 一个标准的solr的索引库
example\lib\ext: solr服务和solrJ客户端依赖的jar包
2. Solr的环境搭建
a: 准备一台干净的tomcat,并更改其端口,避免与我们的项目冲突
b: 解压solr的war包,将解压后的solr放入tomcat的webapps下,并改名为solr(不是必须的)
c: 将example\lib\ext的日志jar拷贝到solr项目的lib包里面
d: 将example\solr拷贝出来,改名为solrHome(不是必须的,大家都习惯叫这个名字)
e: 在solr项目中的web.xml,配置索引库的位置
f: 重启tomcat,访问http://localhost:8888/solr
3. 配置中文分析器
第一步:把IKAnalyzer2012FF_u1.jar添加到solr/WEB-INF/lib目录下。
第二步:复制IKAnalyzer的配置文件和自定义词典和停用词词典到solr的solr/WEB-INF/classes目录下
复制IK分词器配置文件、自定义词典、停用词词典
粘贴到Tomcat的solr的/WEB-INF/classes目录下
第三步:在schema.xml中添加一个自定义的fieldType,使用中文分析器。
<!-- IKAnalyzer-->
<fieldType name="text_ik"class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
第四步:在schema.xml中添加field,指定field的type属性为text_ik
<!--IKAnalyzerField-->
<fieldname="content_ik" type="text_ik" indexed="true"stored="true" />
第五步:重启tomcat
4. Schema.xml中配置业务域
<!--例如:product-->
<fieldname="product_name" type="text_ik" indexed="true" stored="true"/>
<fieldname="product_price" type="float" indexed="true" stored="true"/>
<fieldname="product_description" type="text_ik"indexed="true" stored="false" />
<fieldname="product_picture" type="string"indexed="false" stored="true" />
<fieldname="product_catalog_name" type="string"indexed="true" stored="true" />
<field name="product_keywords"type="text_ik" indexed="true" stored="false"multiValued="true"/>
<!-- 拷贝域 将product_name、product_description的分词拷贝到product_keywords中 搜索product_keywords会搜索product_name、product_description-->
<copyFieldsource="product_name" dest="product_keywords"/>
<copyFieldsource="product_description" dest="product_keywords"/>
5. dataimportHandler插件
使用dataimport插件批量导入数据。
第一步:把dataimport插件依赖的jar包添加到solrcore(collection1\lib)中, 还需要mysql的数据库驱动。orcal数据驱动(ojdbc6)
第二步:配置solrconfig.mxl文件,添加一个requestHandler。
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler> |
第三步:创建一个data-config.xml,保存到collection1\conf\目录下
<?xml version="1.0" encoding="UTF-8" ?> <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/lucene" user="root" password="root"/> <document> <entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products "> <field column="pid" name="id"/> <field column="name" name="product_name"/> <field column="catalog_name" name="product_catalog_name"/> <field column="price" name="product_price"/> <field column="description" name="product_description"/> <field column="picture" name="product_picture"/> </entity> </document> </dataConfig> |
第四步:重启tomcat
//复杂查询索引 @Test publicvoid queryIndex2() throws Exception { //创建连接 SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr"); //创建一个query对象 SolrQuery query = new SolrQuery(); //设置查询条件 query.setQuery("钻石"); //过滤条件 query.setFilterQueries("product_catalog_name:幽默杂货"); //排序条件 query.setSort("product_price", ORDER.asc); //分页处理 query.setStart(0); query.setRows(10); //结果中域的列表 query.setFields("id","product_name","product_price","product_catalog_name","product_picture"); //设置默认搜索域 query.set("df", "product_keywords"); //高亮显示 query.setHighlight(true); //高亮显示的域 query.addHighlightField("product_name"); //高亮显示的前缀 query.setHighlightSimplePre("<em>"); //高亮显示的后缀 query.setHighlightSimplePost("</em>"); //执行查询 QueryResponse queryResponse = solrServer.query(query); //取查询结果 SolrDocumentList solrDocumentList = queryResponse.getResults(); //共查询到商品数量 System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound()); //遍历查询的结果 for (SolrDocument solrDocument : solrDocumentList) { System.out.println(solrDocument.get("id")); //取高亮显示 String productName = ""; Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting(); List<String> list = highlighting.get(solrDocument.get("id")).get("product_name"); //判断是否有高亮内容 if (null != list) { productName = list.get(0); } else { productName = (String) solrDocument.get("product_name"); } System.out.println(productName); System.out.println(solrDocument.get("product_price")); System.out.println(solrDocument.get("product_catalog_name")); System.out.println(solrDocument.get("product_picture")); } } |
设置拷贝域
<!-- 故障名称--><field name="fault_name" type="text_ik" indexed="true" stored="true"/><!-- 故障原因--><field name="fault_reason" type="text_ik" indexed="true" stored="true"/><!-- 排故建议--><field name="fault_solve" type="text_ik" indexed="true" stored="true"/><!-- 综合查询--><field name="fault_all" type="text_ik" indexed="true" stored="true" multiValued="true"/><!-- 将fault_name的分词复制到fault_reason、fault_solve中 按照fault_name检索时会检索这两个字段 --><defaultSearchField>fault_all</defaultSearchField><solrQueryParser defaultOperator="AND"/><copyField source="fault_name" dest="fault_all"/><copyField source="fault_reason" dest="fault_all"/><copyField source="fault_solve" dest="fault_all"/>
查询语句 多字段高亮显示 多域名查询
//创建查询语句SolrQuery query = new SolrQuery();//设置关键字if(keyword == null || keyword.equals("")){keyword = "*:*";}query.setQuery(keyword);//设置查询域 query.set("df", "fault_all");//设置高亮展示query.setHighlight(true);//添加高亮展示域名query.addHighlightField("fault_name");query.addHighlightField("fault_reason");query.addHighlightField("fault_solve");//设置前缀query.setHighlightSimplePre("<font style=\"color:red\">");//设置后缀query.setHighlightSimplePost("</font>");//获得返回值QueryResponse response = solrServer.query(query);//获取结果集SolrDocumentList results = response.getResults();//获得高亮显示结果集Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();List<FaultModel> list = new ArrayList<>();for (SolrDocument fault : results) {FaultModel faultModel1 = new FaultModel();faultModel1.setId(String.valueOf(fault.get("id")));faultModel1.setFaultName(String.valueOf(fault.get("fault_name")));faultModel1.setFaultReason(String.valueOf(fault.get("fault_reason")));faultModel1.setSolveSuggestion(String.valueOf(fault.get("fault_solve")));List<String> nameList = highlighting.get(fault.get("id")).get("fault_name");if( nameList != null && nameList.size() > 0 ){//如果有高亮显示 显示名称faultModel1.setFaultName(nameList.get(0));}else{//如果没有正常显示faultModel1.setFaultName(String.valueOf(fault.get("fault_name")));}List<String> reasonList = highlighting.get(fault.get("id")).get("fault_reason");if( reasonList != null && reasonList.size() > 0 ){//如果有高亮显示 显示名称faultModel1.setFaultReason(reasonList.get(0));}else{//如果没有正常显示faultModel1.setFaultReason(String.valueOf(fault.get("fault_reason")));}List<String> solveList = highlighting.get(fault.get("id")).get("fault_solve");if( solveList != null && solveList.size() > 0 ){//如果有高亮显示 显示名称faultModel1.setSolveSuggestion(solveList.get(0));}else{//如果没有正常显示faultModel1.setSolveSuggestion(String.valueOf(fault.get("fault_solve")));}list.add(faultModel1);}return list;
solr全文检索(多字段搜索)相关推荐
- java商品搜索功能_利用solr实现商品的搜索功能(实例讲解)
后期补充: 为什么要用solr服务,为什么要用luncence? 问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可 ...
- 利用solr实现商品的搜索功能
为什么要用solr服务,为什么要用luncence?问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的 内容,这是怎么做到呢?这些随意的数据不可能是根据数据 ...
- Solr vs ElasticSearch,搜索技术哪家强
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 Solr和ElasticSearch到底有一些什么不同? ...
- solr和lucene_使用Apache Lucene和Solr 4进行下一代搜索和分析
solr和lucene 六年前,我开始为developerWorks撰写有关Solr和Lucene的文章(请参阅参考资料 ). 多年来,Lucene和Solr确立了自己的坚如磐石的技术(Lucene作 ...
- php为什么搜不到字段,php-通过多个字段搜索.有时一个领域,有时不止一个领域
我有搜索表.在这里多个领域.有时我将使用一个字段提交表单,有时将使用两个字段提交表单,有时使用多个字段值. if (isset($_POST['search'])) { $projectName = ...
- Elastic search常用分词 和 多字段搜索优化
分词器 ES的分词器把文本解析为一个一个的词,写入倒排索引中 filter过滤器 lemmagen 词性还原 stop 停顿词 shingle 临近词n个作为一组查询 analyzer分词器 stan ...
- java 多字段搜索_Elasticsearch系列---多字段搜索
### 概要 本篇介绍一下multi_match的best_fields.most_fields和cross_fields三种语法的场景和简单示例. ### 最佳字段 bool查询采取"mo ...
- 微服务集成cas_Spring Boot + Solr 全文检索微服务简易集成
点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者:JasonGofen 链接:https://www.jianshu.com/p/95869ade37b3 本文内容主要讲解Solr 7 ...
- 【相关性搜索】 多字段搜索的两种方式——词中心与字段中心
背景 首先看个例子,有两个 doc,一条是 albino elephant,一条是 elephant elephant PUT test_elephant/_doc/1 {"title_te ...
- 站内搜寻引擎 php mysql_迅搜(xunsearch) - 开源免费中文全文搜索引擎|PHP全文检索|mysql全文检索|站内搜索...
热点新闻 本软件趋于稳定,版本发布速度放缘,久违了,这次加入支持通过 composer 管理 PHP-SDK,并加入 yii2 扩展支持!非常高兴能在今晚发布 xunsearch-1.4.9 正式稳定 ...
最新文章
- Domino设置多台转发主机地址
- jQuery Masonry 一个 jQuery动态网格布局的插件
- mysql合并到区间_合并区间
- Hanlder Looper MessageQueue Message
- 在SAP Data Intelligence Modeler里创建新的pipeline
- 集群部署中解决定时任务重复执行的问题-redis分布式锁应用
- php getimagecompose,Docker进阶:Dockerfile以及docker-compose工具
- [收藏]孔庆东-为何要唱样板戏
- mulitpartfile怎么接收不到值_光端机电源正常,但是运行不了怎么办?
- 小白vue_web前端开发:新手学习前端应该先学vue还是react?
- 在java保存游戏状态_保存游戏状态的最佳方法是什么?
- nod32更新服务无法设置问题更改
- java 车牌识别系统_java车牌识别系统 自动识别车牌系统的工作原理
- 2014年11月合肥黄山宏村之旅
- 电脑 清理android,怎样清除系统垃圾 手机电脑一举拿下【图文】
- DTAS 3D在车身公差分析中的应用案例
- 将数字转换成科学计数法
- R语言绘制柱状图(bar plot)
- 导致谷歌账号停用的原因
- 五百年春光明媚之重建亚历山大图书馆谭