Compass---Search Engine (1)

Compass核心提供了一个Lucene搜索引擎之上的提取层。Compass也提供了很多Lucene之上的特征,就像两阶段事务管理,快速更新和优化器。当尝试去解释Compass是怎么与搜索引擎合作时,首先我们需要去理解搜索引擎域模型。

一 Alias,Resource 和 Property
Resouce代表一组property。你可以把它想成是一个虚拟的文档--大量数据,就像一个网页,一个电子邮件信息,或者是一个Author对象的序列化。一个Resource总是与一个Alias关联并且多个Resources可以用同一个Alias。Alias扮演着Resource与它的映射定义(OSEM/XSEM/RSEM)之间的连接。一个Property只是一个名称和值(键值对)的占位。Resource里的一个Property代表着一些种类元数据,它们与Resource关联就像作者姓名。
    每个Resource关联着一个或更多的id属性。它们对于Compass管理加载基于id和Resource更新的Resource是必须的。id属性或者明确定义在RSEM中或者隐含在OSEM/XSEM定义中。

对于Lucene用户来说,Compass的Resource对应lucene Document,compass的Property对应Lucene的Field。

1 使用Resource/Property
当工作在RSEM下,resources但当你的最初数据模型。它们用于构建可搜索内容,也操纵它。当执行一次搜索,resources用于显示搜索结果。
另一个resource可以使用的重要位置,经常被忽略的,是与OSEM/XSEM。当通过使用应用域模型或xml数据结构操作搜索内容时,resources很少被使用。当执行搜索操作时它们可以被使用。基于你的映射定义,通过resources和Property用一种非定制方式可以进入语义模型。
让我们使用一个例子来简单化这些语句。如果我们的应用有两个对象类型,处方和成分,我们能够同时将处方标题和成分标题映射到同一个语义元数据名称,标题(title,Resource Property 名称)。这将允许我们在搜索显示搜索结果时只在Resource级别,提出属性标题(title)的值从资源列表返回的。
 二 分析器

    分析器是输入文本预处理组件。它们也用于搜索时(搜索串需要用同一种方式处理)。然而,在索引和搜索时使用同一个分析器通常是重要的。

    Analyzer是一个lucene类(限定org.apache.lucene.analysis.Analyzer类)。Lucene核心伴随着很多分析器,并且你可以配置Compass与他们中的任何一个配合。如果我们以下面的句子为例“The quick brown fox jumped over the lazy dogs”,我们来看不同的分析器是如何处理的:
whitespace (org.apache.lucene.analysis.WhitespaceAnalyzer):
[The] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
simple (org.apache.lucene.analysis.SimpleAnalyzer):
[the] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
stop (org.apache.lucene.analysis.StopAnalyzer):
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
standard (org.apache.lucene.analysis.standard.StandardAnalyzer):
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
Lucene也伴随着一个扩展库,支持很多分析器实现(包括语言指定分析器)。Compass也可以和他们所有的配置合作。

1 配置分析器

一个Compass实例担当着分析器的注册处,因为每个分析器都绑定着一个查找名。Compass里的两个内部分析器名是:default和search. 当没有配置其他分析器时default就用于默认的分析器(使用不同分析器的配置通常在映射定义时通过指向一个不同的分析器查找名完成的)。当没有配置其他分析器时search分析器用在搜索查询字符串上(当执行一个基于通过查询构建器接口的查询字符串的搜索时配置一个不同的分析器时完成的)。默认情况下,当什么都没用配置时,Compass将使用Lucene标准分析器作为默认分析器。

下面是一个配置两个分析器的例子,一个将取代default分析器,另一个通过myAnalyzer注册(可能稍后被引用到不同的映射定义中)。

<compass name="default">
<connection>
<file path="target/test-index" />
</connection>
<searchEngine>
<analyzer name="deault" type="Snowball" snowballType="Lovins">
<stopWords>
<stopWord value="no" />
</stopWords>
</analyzer>
<analyzer name="myAnalyzer" type="Standard" />
</searchEngine>
</compass>

Compass也支持Lucene分析器的自定义实现(注:可以实现分析器filter完成同样的目标,稍后介绍),如果实现类也实现了CompassConfigurable,其他设置(参数)能够通过配置文件注入它。
这里有一个配置例子,注册一个能接受一个名为threshold的参数自定义分析器实现类:

<compass name="default">
<connection>
<file path="target/test-index" />
</connection>
<searchEngine>
<analyzer name="deault" type="CustomAnalyzer" analyzerClass="eg.MyAnalyzer">
<setting name="threshold">5</setting>
</analyzer>
</searchEngine>
</compass>

  

2 分析器过滤器(Analyzer Filter)

过滤器是为分析流的其他过滤提供简单地支持,与创建你自己的分析器没有冲突。同样,过滤器能够在不同的分析器之间共享,潜在地含有不同的分析器类型。
    一个自定义过滤器实现需要实现Compass的LuceneAnalyzerTokenFilterProvider类,它只有一个创建Lucene TokenFilter的方法。过滤器也是以一个名字登记,然后可以再分析器配置里指向它们。下面的例子时候配置两个分析器过滤器,应用到default分析器上:

<compass name="default">
<connection>
<file path="target/test-index" />
</connection>
<searchEngine>
<analyzer name="deafult" type="Standard" filters="test1, test2" />
<analyzerFilter name="test1" type="eg.AnalyzerTokenFilterProvider1">
<setting name="param1" value="value1" />
</analyzerFilter>
<analyzerFilter name="test2" type="eg.AnalyzerTokenFilterProvider2">
<setting name="paramX" value="valueY" />
</analyzerFilter>
</searchEngine>
</compass>

3 处理同义字
由于同义词是一个搜索应用程序的共同要求,Compass带有一个简单的同义词分析器过滤器:
SynonymAnalyzerTokenFilterProvider.它的实现要求作为一个SynonymLookupProvider执行的参数,能够返回所给值的所有同义词。没有提供实现,但是可以定位到一个公开的同义词数据库,或一个文件输入结构的简单实现。下面是如何配置的例子:

<compass name="default">
<connection>
<file path="target/test-index" />
</connection>
<searchEngine>
<analyzer name="deafult" type="Standard" filters="synonymFilter" />
<analyzerFilter name="synonymFilter" type="synonym">
<setting name="lookup" value="eg.MySynonymLookupProvider" />
</analyzerFilter>
</searchEngine>
</compass>

注意:实际上我们没有为type设置全限定类名。这是Compass提供的一个简单化实现(自然地,你可以仍然使用同义词象征过滤器提供者的全限定类名)。

三 类似处Similarity
Compass能够使用Lucene的Similarity类为索引和搜索进行配置。这是高级配置级别。默认情况下,Lucene的DefaultSimilarity用于搜索和索引。

为了全面转变Similarity,Similarity的类型可以使用compass.engine.similarity.default.type来设置。type的值可以是Similarity实现类的真正的类名,也可以使SimilarityFactory实现类的类名。为了用CompassSettings注入,它们都可以选择性地实现CompassConfigurable接口。
 特别指出的是,索引Similarity可以使用compass.engine.similarity.index.type设置。搜索Similarity可以使用compass.engine.similarity.search.type来设置。

猜你喜欢

转载自crazycat03.iteye.com/blog/613281