配置搜索字段¶
在某些情况下,修改或扩展元数据索引的搜索字段是相关的。例如,添加一个字段(然后可以搜索或在默认视图中使用)或更改字段的内容是根据元数据创建的(索引)。
整个索引的字段数量和类型在以下位置管理:
接下来,在每个模式插件中,您可以定义如何从文件中的元数据内容填充新字段:
Lucene 是GeoNetwork使用的搜索引擎。所有Lucene配置都在WEB-INF/config中定义-lucene.xml文件.
添加搜索字段¶
索引字段是根据模式文件夹(如WEB-INF/data/config/schema_plugins/iso19139/index fields)中的每个模式定义的默认.xsl文件。此文件为每个搜索条件定义元数据记录中的相应元素。例如,索引ISO19139记录的标题:
<xsl:for-each select="gmd:identificationInfo/gmd:MD_DataIdentification/
gmd:citation/gmd:CI_Citation/
gmd:title/gco:CharacterString">
<Field name="mytitle" string="{string(.)}" store="true" index="true"/>
</xsl:for-each>
通常,如果该字段仅用于搜索且不应显示在搜索结果中,则可以将store属性设置为false。
一旦该字段添加到索引中,用户就可以在不同类型的搜索服务中使用它作为搜索条件进行查询。例如,使用:
http://localhost:8080/geonetwork/srv/en/q?mytitle=africa
如果用户希望将此字段标记化,则应将其添加到配置的标记化部分-lucene.xml文件:
<tokenized>
<Field name="mytitle"/>
如果用户希望在搜索服务的搜索结果中返回此字段,则应将该字段添加到dumpFields部分中的Lucene配置:
<dumpFields>
<field name="mytitle" tagName="mytitle"/>
提升文档和字段¶
文档和字段增强允许目录管理员自定义默认Lucene评分,以便升级某些类型的记录。
一个常见的用例是当目录包含大量用于聚合数据集的序列时。即使这些记录包含重要内容,不推广该系列也可能使该系列变得“无用”。提升这类文档可以提升序列,并引导最终用户从序列到相关记录(通过关系导航)。
在这种情况下,以下配置允许提升序列和序列中记录部分的次要重要性:
<boostDocument name="org.fao.geonet.kernel.search.function.ImportantDocument">
<Param name="fields" type="java.lang.String" value="type,parentUuid"/>
<Param name="values" type="java.lang.String" value="series,NOTNULL"/>
<Param name="boosts" type="java.lang.String" value=".2F,-.3F"/>
</boostDocument>
升压是一个正浮点数或负浮点数。
专家用户必须使用此功能根据目录内容更改默认搜索行为评分。它需要调整和实验,以避免提升太多的一些记录。在测试过程中,如果搜索结果在记录与否时看起来不一样,那么可以忽略boost计算中的一些内部字段,这些字段可能会根据当前用户改变评分。配置示例:
<fieldBoosting>
<Field name="_op0" boost="0.0F"/>
<Field name="_op1" boost="0.0F"/>
<Field name="_op2" boost="0.0F"/>
<Field name="_dummy" boost="0.0F"/>
<Field name="_isTemplate" boost="0.0F"/>
<Field name="_owner" boost="0.0F"/>
</fieldBoosting>
提升搜索结果¶
默认情况下,Lucene根据搜索条件、相应的结果集和索引内容计算分数。如果搜索没有条件,Lucene将按索引顺序返回顶级文档(因为没有比其他文档更相关)。
为了改变分数计算,可以定义一个boost函数。需要在类路径中加载Boosting查询。提供了一个示例boosting类。RecencyBoostingQuery将升级最近修改的文档:
<boostQuery name="org.fao.geonet.kernel.search.function.RecencyBoostingQuery">
<Param name="multiplier" type="double" value="2.0"/>
<Param name="maxDaysAgo" type="int" value="365"/>
<Param name="dayField" type="java.lang.String" value="_changeDate"/>
</boostQuery>