树莓派指南针应用_指南针:将搜索整合到您的应用中

树莓派指南针应用

动机

在许多应用程序中,用户需要搜索或查找域实体。 它既可以作为应用程序的入口点,也可以作为填写表格的机制。 通常,这可以通过导航(分层显示域,以便用户可以找到和选择项目)或搜索表单(向用户显示包含可以搜索的多个字段的表单)来解决。

实际情况是,从可用性角度来看,这两种方法都不是最佳选择。 当存在大量实体时,导航方法很快变得缓慢而麻烦。 同样,用户通常确切知道他们要查找的实体,但是他们被迫导航层次结构以找到它。 搜索表单方法还受到可以搜索的字段数的限制。 在能够搜索足够多的字段和搜索表单本身的复杂性之间需要权衡。

从可用性的角度来看,答案是提供一个Google样式的搜索框,用户可以在其中输入与他们要搜索的实体的任何字段相匹配的字词,并显示与这些字词匹配的结果条款。 它可以是表单中的自动完成的,谷歌建议的样式输入字段,也可以是具有表格结果的常规搜索,但是解决方案的本质是用户界面简单,用户输入他们选择的任何条件以及搜索做所有的努力。 现在唯一的问题是如何实现此搜索功能。

面对实现传统的多字段搜索表单的任务时,大多数应用程序都转向SQL。 搜索字段通常与SQL查询将在LIKE子句中使用的列匹配。 但是,由于在这么多字段上进行匹配所需SQL的复杂性,以及潜在地这些字段的文本大小,这种实现的性能通常非常差。 第二个问题是搜索结果没有排名的事实,返回的命中率不是根据它们与搜索查询的相关性而是简单地判断它们是否与查询匹配。 第三,不支持突出显示与搜索结果匹配的搜索词。

很快,大多数应用程序意识到这里需要一个搜索引擎。 可以为实体的所有字段建立索引,就好像它是单个文档一样,然后可以执行常规文本搜索以检索匹配的实体。 Lucene是最著名的开源搜索引擎之一。 Lucene是一个出色的搜索引擎,已被许多应用程序成功使用。 它提供了一个低级搜索引擎API,能够使用Lucene数据结构(文档/字段)为数据建立索引,并能够使用查询API或搜索引擎查询对它们进行搜索。 它支持多种语言,包括Java,C#和C ++。

如果我们分析一个典型的Web应用程序,它通常具有非常通用的结构和特征。 通常,该应用程序使用后端关系数据库。 它具有代表系统内主要实体的域模型,并使用ORM框架将域模型映射到数据库。 大多数情况下,它使用服务层框架来管理事务,协调(有时还包括业务逻辑)和Web框架。 现在的问题是如何将Lucene集成到这样的应用程序中。

当试图将Lucene集成到应用程序中时,一旦遇到了一个相对小的使第一个峰值正常工作的障碍,就会很快遇到许多挑战。 第一个问题是索引应用程序数据。 不久之后,大量的样板代码专门用于将应用程序领域模型映射到Lucene数据结构中,并再次将其取回。 Lucene的主要数据结构Lucene Document是一个扁平的,类似于Map的数据结构,仅包含字符串-因此,并不是无关紧要的大量代码专门用于将域对象“编组”和“解组”。 另一个问题是Lucene中缺乏事务支持,这使得将域模型保存到数据库中并导致搜索引擎出现问题。 使用Lucene,缓存和使搜索器无效,创建聚合的“所有”属性以支持google风格的搜索,具有可标识的文档以进行适当的更新语义时,还应使用其他几种众所周知的做法和模式。

指南针介绍

Compass的目的是简化将搜索功能集成到任何应用程序中的过程。 指南针是在Lucene的基础上使用定义明确的搜索引擎抽象构建的。 Compass扩展了核心Lucene,并添加了事务支持和快速更新,以及将索引存储在数据库中的功能。 同样,最重要的是,它并没有试图隐藏Lucene的功能-所有的Lucene功能都可以通过Compass获得。

指南针核心API

指南针提供了一个简单而熟悉的API。 该API很熟悉,因为它模仿(在适用的情况下)当前的ORM工具API以降低Compass的学习曲线,因此Compass API围绕着几个主要接口进行旋转:

  • CompassConfiguration :用于基于一组设置,配置文件和映射定义来配置指南针。 然后将其用于创建Compass实例。
  • Compass :一个线程安全实例,用于打开Compass Sessions以供单线程使用。 还提供一些搜索引擎索引级别的操作。
  • CompassSesssion :用于执行搜索引擎操作(如保存,删除,查找和加载)的主要界面。 非常轻巧且非线程安全。
  • CompassTransaction :用于控制Compass交易的接口。 事务管理环境(例如Spring / JTA)不需要使用它。

这是使用API​​的简单示例:

// Compass is configured and created on an application scope
CompassConfiguration conf =
new CompassConfiguration().setConnection("/tmp/index").addClass(Author.class);
Compass compass = conf.buildCompass();

// A request scope operation
CompassSession session = compass.openSession();
CompassTransaction tx = null;
try {
tx = session.beginTransaction();
...
session.save(author);
CompassHits hits = session.find("jack london");
Author a = (Author) hits.data(0);
Resource r = hits.resource(0);
...
tx.commit();
} catch (CompassException ce) {
if (tx != null) tx.rollback();
} finally {
session.close();
}

为了简化交易管理代码,Compass提供了几种选择,第一种是使用CompassTemplate ,该模板使用流行的模板设计模式来抽象出交易管理代码。 第二个选项适用于在事务管理的环境中工作,在该环境中Compass与JTA和Spring Transactions等事务管理器集成并在已经运行的事务中运行。 在这种情况下,可以通过使用执行会话操作时自动加入事务的代理来使用CompassSession。 代理创建可以是编程的,也可以使用Spring Ioc(Spring 2中的@CompassContext注入支持)。

Compass支持原子事务操作,并与不同的事务管理策略集成,包括:本地事务管理,用于JTA集成的JTA Sync和XA以及Spring Synchronization集成。

指南针配置基于键值设置。 可以使用程序配置,基于xml DTD的配置(定义映射和设置)以及基于表达性xml模式的配置来配置Compass。 基于xml模式的配置也可以与Spring 2新的基于模式的配置支持一起使用。

搜索引擎映射

Compass的主要功能之一是能够从应用程序模型到搜索引擎进行声明性映射。 指南针搜索引擎域模型包括资源(Lucene文档)和属性(Lucene字段)。 这是用于索引可搜索内容的抽象数据对象。

扫描电镜

第一个映射是RSEM(资源/搜索引擎映射)。 这是从Compass Resource and Property搜索引擎抽象(映射到Lucene Document and Field)到搜索引擎的低级映射。 这是作者资源的RSEM定义示例:

<resource alias="author">
<resource-id name="id"/>
<resource-property name="firstName"/>
<resource-property name="lastName" store="yes" index="tokenized"/>
<resource-property name="birthdate" converter="mydate"/>
</resource>

在这里,我们定义了针对作者别名映射的资源。 资源映射具有与资源关联的ID,以及其他一些属性。 定义属性是可选的,尽管它们确实允许声明性地控制不同的属性特征,包括将一个属性与转换器关联的能力。 以下是用数据填充作者资源并为其编制索引的代码。

Resource r = session.createResource("author");
r.addProperty("id", "1")
.addProperty("firstName", "jack")
.addProperty("lastName", "london")
.addProperty("birthdate", new Date());
session.save(r);

以上代码片段中公开了Compass的某些功能。 首先是由于可以识别资源的事实,如果索引中已经存在Compass,Compass将对其进行更新。 第二个功能是声明性地将转换器分配给属性的能力,以及使用许多内置于Compass的Compass的能力。 这是上述代码的Compass配置(包括mydate转换器配置):

<compass-core-config xmlns="http://www.opensymphony.com/compass/schema/core-config"
xsi:schemaLocation="http://www.opensymphony.com/compass/schema/core-config
http://www.opensymphony.com/compass/schema/compass-core-config.xsd">
<compass name="default">
<connection>
<file path="index" />
</connection>
<converters>
<converter name="mydate" type="org.compass.core.converter.basic.DateConverter">
<setting name="format" value="yyyy-MM-dd" />
</converter>
</converters>
<mappings>
<resource location="sample/author.cpm.xml" />
</mappings>
</compass>
</compass-core-config>

OSEM

支持的第二个映射是OSEM(对象/搜索引擎映射)。 它允许将应用程序对象域模型映射到搜索引擎中。 以下是Author类的示例,带有使用注释的OSEM定义:

@Searchable
public class Author {

@SearchableId
private Long id;

@SearchableComponent
private String Name;

@SearchableReference
private List books;

@SearchableProperty(format = "yyyy-MM-dd")
private Date birthdate;
}

// ...

@Searchable
public class Name {

@SearchableProperty
private String firstName;

@SearchableProperty
private String lastName;
}

OSEM支持将对象层次结构编组和解组到资源中。 保存Author对象时,Compass会将其编组为一个Resource,将Name类编组为代表Author的同一Resource(由于组件映射),并引用author列表中的每本书(存储在其他资源中)。 然后,所产生的资源将被保存/索引到搜索引擎中。

Compass提供了一种非常灵活的机制来将域模型映射到搜索引擎中。 上面的示例只是其中的一个简单示例。 OSEM允许指定自定义转换器,每个类属性多个元数据(到资源属性的映射),分析器,“所有”字段参与等等。

这是一个可以使用author类的示例:

// ...
Author author = new Author(1, new Name("jack", "london"), new Date());
session.save(author);
// ...
author = (Author) session.load(Author.class, 1);

XSEM

Compass支持的最后一个搜索引擎映射是XSEM(Xml /搜索引擎映射)。 这种映射允许直接基于xml映射定义(由xpath驱动)将xml数据结构映射到搜索引擎中。 XSEM过程在资源之间经历相同的编组和解组过程。 Compass引入了一个名为XmlObject的xml包装对象,该对象具有不同的实现(dom4j,W3C Document),该对象还允许对xpath表达式求值。 如果我们采用以下xml数据结构:

<xml-fragment>
<author id="1">
<firstName>Jack</firstName>
<lastName>London</lastName>
</author>
</xml-fragment>

这是一个可能的XSEM定义:

<compass-core-mapping>
<xml-object alias="author" xpath="/xml-fragment/author">
<xml-id name="id" xpath="@id" />
<xml-property xpath="firstName" />
<xml-property xpath="lastName" />
<xml-content name="content" />
</xml-object>
</compass-core-mapping>

映射使用xpath表达式从xml数据结构映射到搜索引擎。 xml-content映射允许在搜索引擎中按原样存储xml结构,因此可以在加载/搜索数据时使用它。 Compass支持几个xml dom库(用于xml内容映射),包括JSE 5,dom4j(SAX和XPP),并且可以轻松实现自定义实现。 这是一个如何使用它的示例:

Reader reader = // construct an xml reader over raw xml content
AliasedXmlObject xmlObj = RawAliasedXmlObject("author", reader);
session.save(xmlObj);
// ...
Resource resource = session.loadResource("author", 1);
// since we have xml-content, we can do the following as well
XmlObject xmlObj = session.load("author", 1);

指南针Gps

Compass Gps是Compass中的一个模块,旨在将Compass与不同的数据源集成在一起。 最受欢迎的数据源集成是Compass与不同ORM工具的集成。 指南针支持JPA,Hibernate,OJB,JDO和iBatis。

以Hibernate为例,Compass引入了两个主要操作:索引编制和镜像。 索引允许使用Hibernate映射和Compass映射自动为数据库内容建立索引。 具有两个映射的对象将使用Hibernate自动从数据库中获取并保存到搜索引擎中。 通过向Hibernate注册事件监听器,镜像允许将使用Hibernate API完成的操作自动镜像到搜索引擎中。 这样,通过Hibernate API对数据库所做的任何更改都可以使索引保持最新。 下面显示了如何使用Compass Gps Hibernate集成:

SessionFactory sessionFactory = // Hibernate Session Factory
Compass compass = // set up a Compass instance
CompassGps gps = new SingleCompassGps(compass);
CompassGpsDevice device = new Hibernate3GpsDevice("hibernate", sessionFactory);
gps.addDevice(device);
// start the gps, mirroring any changes made through Hibernate API
// to be mirrored to the search engine
gps.start();

// ....

// this will cause the database to be indexed
gps.index();
// this will cause Hibernate to store the author in the database
// and also index the author object through Compass
hibernateSess.save(new Author(1, new Name("jack", "london"), new Date()));

摘要

本文是对Compass及其主要功能的简要介绍,但仅涵盖了如何使用Compass的基础知识(最值得注意的是,Compass具有与Spring的广泛集成模块)。 指南针在使用搜索引擎时还涵盖了许多平凡和细微的差别,并具有广泛的配置支持。 如前所述,Compass的主要目标是简化将Search集成到任何类型的应用程序中的过程,这篇简短的文章介绍了如何完成搜索的基础知识。

翻译自: https://www.infoq.com/articles/compass-search-tutorial/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

树莓派指南针应用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值