要想使得一个搜索系统更加的完美,查询精确度和页面显示算是其中比较重要的两个方面。今天,我们就来谈谈怎么使得我们的搜索系统更加的完美。


  • 关于分词

    • 下载地址
    • 配置
  • 关于高亮
  • 关于排序
    • 原理
    • 冗余字段
    • 使用方式
    • 测试排序
  • 关于过滤
    • 原理
    • 冗余字段
    • 如何使用
    • 测试过滤
  • 关于查询
  • 总结

关于分词

分词的好坏直接关系到我们的查询系统的精准度。所以一个更加适合的分词方式很重要。对于中文而言,更是如此。

Compass配置分词器简直是不能再简单了。我这里使用一个中科院研制的一个高效中文分词器。JE-Analysis,

下载地址

配置

我们使用xml的方式对分词器进行配置。
导入刚才下载的jar包之后,我们可以在项目的依赖中找到如图所示信息。

右键红色区域文件,点击copy qualified name。然后配置成如下面貌即可。

<?xml version="1.0" encoding="UTF-8" ?>
<compass-core-config xmlns="http://www.compass-project.org/schema/core-config"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.compass-project.org/schema/core-confighttp://www.compass-project.org/schema/compass-core-config-2.2.xsd"><compass name="default"><!-- 连接信息,好比数据库的连接信息 --><connection><file path="./indexDir/" /></connection><!-- 映射信息,好比Hibernate的映射关系 --><mappings><class name="domain.Article" /></mappings><!-- 分词器以及高亮器的配置 --><settings><!-- 分词器的配置,可选择中文的 --><setting name="compass.engine.amalyzer.default.type" value="jeasy.analysis.MMAnalyzer" /></settings></compass>
</compass-core-config>   

好了,大功告成了。

关于高亮

对于高亮而言,我们其实并未真正的改变原始数据,而是将取出来的数据进行了一些包装而已。这样影响的仅仅是显示在我们的页面上数据。

高亮在Compass中更加方便,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<compass-core-config xmlns="http://www.compass-project.org/schema/core-config"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.compass-project.org/schema/core-confighttp://www.compass-project.org/schema/compass-core-config-2.2.xsd"><compass name="default"><!-- 连接信息,好比数据库的连接信息 --><connection><file path="./indexDir/" /></connection><!-- 映射信息,好比Hibernate的映射关系 --><mappings><class name="domain.Article" /></mappings><!-- 分词器以及高亮器的配置 --><settings><!-- 分词器的配置,可选择中文的 --><setting name="compass.engine.amalyzer.default.type" value="jeasy.analysis.MMAnalyzer" /><!-- 高亮器前缀 --><setting name="compass.engine.highlighter.default.formatter.simple.pre" value="&lt;font color='red' &gt;" /><!-- 高亮器后缀 --><setting name="compass.engine.highlighter.default.formatter.simple.post" value="&lt;/font&gt;" /><!-- 高亮器摘要的长度 --><setting name="compass.engine.highlighter.default.fragmenter.simple.size" value="100" /></settings></compass>
</compass-core-config>   

关于排序

类比国内某搜索引擎,排序其实并不公平。我们可以认为的控制排序,Compass亦是如此。

原理

不管是Compass还是数据库,我们都会通过冗余字段来提高检索速度。或者进行排序。所以我们会在bean对象中添加一个冗余字段来帮助我们对数据进行排序操作。

冗余字段

/*** @Date 2016年8月2日** @author Administrator*/
package domain;import org.compass.annotations.ExcludeFromAll;
import org.compass.annotations.Index;
import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableBoostProperty;
import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;
import org.compass.annotations.Store;/*** * Compass的映射配置要求* * 在实体类上面有一个@Searchable注解<br>* * 在属性上面,至少有一个有@SearchableId* * 其他的属性只需要是@SearchableProperty即可* * * * @author 郭瑞彪*/
@Searchable
public class Article {@SearchableIdprivate Integer id;// @SearchableProperty(store = Store.YES, index =// Index.ANALYZED,,excludeFromAll=ExcludeFromAll.YES)查询的时候就会排除此项来进行查询操作@SearchableProperty(store = Store.YES, index = Index.ANALYZED)private String title;@SearchableProperty(store = Store.YES, index = Index.ANALYZED)private String content;// 如果要想改变查询结果的顺序,这个bean里面就应该有一个记录boostValue的值,这样使用的时候在具体的结果集对象上进行修改即可@SearchableBoostPropertyprivate float boostValue = 1F;public float getBoostValue() {return boostValue;}public void setBoostValue(float boostValue) {this.boostValue = boostValue;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}@Overridepublic String toString() {return "Article [id=" + id + ", title=" + title + ", content=" + content + "]";}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}}

使用方式

我们在存储数据的时候就可以指定某一个对象的权重了。即设置刚才的serBoostValue。这样在我们获取数据的时候,就会获得排序的数据。

测试排序

@Testpublic void testBoostValueSearch() throws Exception {String queryString = "lucene";// 查询,得到结果List<Article> articles = new ArrayList<Article>();// 建立索引Compass compassSessionFactory = CompassUtils.getCompassSessionFactory();CompassSession session = compassSessionFactory.openSession();CompassTransaction tx = session.beginTransaction();CompassHits hits = session.find(queryString);// 处理结果for (int i = 0; i < hits.length(); i++) {Article a = (Article) hits.data(i);if (i == 0)a.setBoostValue(2F);articles.add(a);}tx.commit();session.close();// 显示结果System.out.println(articles.toString());for (Article a : articles) {System.out.println("-----------搜索结果如下-----------------");System.out.println(">>>id: " + a.getId());System.out.println(">>>title:" + a.getTitle());System.out.println(">>>content:" + a.getContent());}}

关于过滤

原理

过滤的话,无非就是要哪一段数据,不要那一段数据。这自然是关乎到查询方式的变化,同样Compass就是基于这么个理念,赋予query对象新的filter。从而实现过滤操作。过滤的实现,同样要依赖于一个冗余字段。(需要在这个字段上声明@SearchableProperty注解)

冗余字段

/*** @Date 2016年8月2日** @author Administrator*/
package domain;import org.compass.annotations.ExcludeFromAll;
import org.compass.annotations.Index;
import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableBoostProperty;
import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;
import org.compass.annotations.Store;/*** * Compass的映射配置要求* * 在实体类上面有一个@Searchable注解<br>* * 在属性上面,至少有一个有@SearchableId* * 其他的属性只需要是@SearchableProperty即可* * * * @author 郭瑞彪*/
@Searchable
public class Article {@SearchableIdprivate Integer id;// @SearchableProperty(store = Store.YES, index =// Index.ANALYZED,,excludeFromAll=ExcludeFromAll.YES)查询的时候就会排除此项来进行查询操作@SearchableProperty(store = Store.YES, index = Index.ANALYZED)private String title;@SearchableProperty(store = Store.YES, index = Index.ANALYZED)private String content;// 为了过滤器所需@SearchableProperty(store = Store.YES, index = Index.ANALYZED)private int filmeta;public int getFilmeta() {return filmeta;}public void setFilmeta(int filmeta) {this.filmeta = filmeta;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}@Overridepublic String toString() {return "Article [id=" + id + ", title=" + title + ", content=" + content + "]";}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}}

如何使用

使用的时候需要将过滤信息附加到查询对象query上,这样才能生效。

CompassQuery query = null;
CompassQueryFilter filter = null;
filter = session.queryFilterBuilder().between("filmeta", 3, 7, true, true);
query=session.queryBuilder().queryString(queryString).toQuery();
query.setFilter(filter);

测试过滤

@Testpublic void testFilterSearch() throws Exception {String queryString = "lucene";// 查询,得到结果List<Article> articles = new ArrayList<Article>();// 建立索引Compass compassSessionFactory = CompassUtils.getCompassSessionFactory();CompassSession session = compassSessionFactory.openSession();CompassTransaction tx = session.beginTransaction();CompassHits hits = null;CompassQuery query = null;CompassQueryFilter filter = null;// 构建查询对象,我们可以使用这样的queryBuilder方式创建出各式各样的查询方式,如布尔查询,关键词查询,短语查询,模糊查询等等filter = session.queryFilterBuilder().between("filmeta", 3, 7, true, true);query = session.queryBuilder().queryString(queryString).toQuery();query.setFilter(filter);hits = query.hits();// 处理结果for (int i = 0; i < hits.length(); i++) {Article a = (Article) hits.data(i);if (i == 0)a.setBoostValue(2F);articles.add(a);}tx.commit();session.close();// 显示结果System.out.println(articles.toString());for (Article a : articles) {System.out.println("-----------搜索结果如下-----------------");System.out.println(">>>id: " + a.getId());System.out.println(">>>title:" + a.getTitle());System.out.println(">>>content:" + a.getContent());}}

关于查询

在Compass中,查询操作更是方便,我们只需要调用相关的API即可。如下图

不难看出,各种查询的底层就是基于过滤来实现的,所以我们可以一句过滤的操作来实现我们的各种查询需求。

总结

经过了这两天的搜索引擎框架的学习,基本上我们可以开发出适合自己项目需求的站内搜索或者全文搜索了。至此,本系列学习也到此结束。

如果我的这些文章恰好给对此迷茫的你一点灵光,我就非常的欣慰了。

:-)

Compass 更智能的搜索引擎(3)--高亮,排序,过滤以及各种搜索相关推荐

  1. 正在搜索需要的文件_【数澜发布-澜寻】智能内容搜索引擎,释放“机器阅读” 潜力...

    4月23日,又是一年世界读书日.知识传播的重要性在这一天被无数次提起,记录.阅读成为我们 "理解"这个世界的加速通道,但在科技力量迅猛发展的当下,阅读这件事早已不再局限于人类. 人 ...

  2. 搜索引擎利用机器学习排序

    搜索引擎利用机器学习排序 标签: 搜索引擎机器学习排序 2013-07-29 20:52 1414人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 机器学习与数据挖掘(24) 作者同类文章X ...

  3. 智能语义搜索引擎:一站式检索服务、打通数据壁垒、充分挖掘数据价值 | 百万人学AI评选

    2020 无疑是特殊的一年,而 AI 在开年的这场"战疫"中表现出了惊人的力量.站在"新十年"的起点上,CSDN[百万人学AI]评选活动正式启动.本届评选活动在 ...

  4. 读书笔记:《SEO教程:搜索引擎优化入门与进阶》(1)——搜索引擎收录及排序的基础知识

    搜索引擎对页面的收录 收录流程: 搜索引擎蜘蛛通过域名进入网站,通过首页涉及到的URL逐步深入地进行循环爬取,建立网页数据库. 每一个网页都会对应记录唯一的URL和此页面上的文字信息,然后对这些文字信 ...

  5. 求解在线教育长期价值 夸克想让拍题更快,错题本更智能

    2020年,线上学习成为刚需,在线教育野蛮生长,凡是有注意力的地方,就有在线教育平台的身影. 资本亦是目光雪亮,仅2020年最后一个月,在线教育领域就产生了近70亿美元的融资额度.没有人可以想象在线教 ...

  6. 亚洲信贷监察:数据分析让应收账款管理更智能

    应收账款管理是一个复杂且多样化的问题,现在,在可靠的分析技术支持下,应收账款管理逐渐成为了可高效运作的业务. 亚洲信贷监察是最早的信用管理服务的提供者之一,在香港本地及其他亚洲国家和地区进行应收账款管 ...

  7. TOOM网络舆情监控平台让舆情监控更智能,网络舆情监控平台有哪些

    现在有很多网络舆情监测平台,想问下哪个网络舆情监测平台比较专业和靠谱呢?TOOM网络舆情监控平台让舆情监控更智能,网络舆情监控平台有哪些,接下来我们简单了解一下. 一.舆情监控平台让舆情监控更智能 舆 ...

  8. 至强® 平台配备先进遥测技术让您的数据中心更智能

    至强® 平台配备先进遥测技术让您的数据中心更智能 传感器数据可以使您的数据中心更智能.英特尔可以帮助云服务提供商 (CSP) 使用遥测技术来优化电源使用效率 (PUE).降低总体拥有成本 (TCO) ...

  9. 如何让人工智能更智能?你需要一个开源平台

    如何让人工智能更智能?你需要一个开源平台 2020年6月19日,奥斯纳布吕克州下萨克森:Melanie Ploppa老师在教室中为小学生们上课.由于新冠隔离法规的限制,目前各学校必须采取特殊的卫生管理 ...

最新文章

  1. vue热更新失效_vue cli@3项目style标签里面热更新失效的问题
  2. Windows 技巧篇 - cmd的复制和粘贴功能
  3. 首届CCF真题5-任务调度
  4. java 方法 示例_Java ArrayDeque offerFirst()方法与示例
  5. 并发服务器模型——多线程服务器
  6. Altium AD20更改原理图栅格改为点栅格
  7. android 4.0.3开机时不能收到广播
  8. HFSS学习笔记—19.HFSS模型导出dxf文件并绘制PCB
  9. 路径规划:RRT算法在ROS中的实现
  10. 天创速盈电商:拼多多用户群体分析
  11. 关于计算机分类 按用途可以分为,计算机的分类一般分为
  12. 27个精美的时间线(含源代码)
  13. TX2 外接硬盘,并随启动自动挂载
  14. 12月19日科技资讯|富士康员工涉嫌盗卖 iPhone 零件遭调查;IntelliJ IDEA 2019.3.1 发布
  15. galaxy s6 android8,这些三星机型确认可以升级Android 8.0
  16. GET http://localhost:8082/ net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)
  17. 10-1 查询没有课程成绩的学生学号、姓名、性别。
  18. 集成测试最全详解,看完必须懂了
  19. 怎样用ps做出3D分割效果海报图
  20. python高级数据分析_8、Python 数据分析-Pandas高级操作

热门文章

  1. linux编辑模式复制快捷键,Linux vim删除、复制、粘贴快捷键
  2. 客户端访问https时应无浏览器(含终端)安全警告信息;_https和http有什么区别(内附详细分析)...
  3. vim折叠的使用方法
  4. 判断python模型是否安装的办法
  5. big sur 关闭sip_青岛市第二批拟关闭退出化工生产企业公示
  6. 天翼云从业认证(4.11)天翼云物流行业解决方案
  7. The following profiles are active: dev
  8. java调用webservice几种方式
  9. oracle查看数据库名和实例名
  10. python 如何调用远程接口