1

我有一个搜索应用程序,由于文档的性质,用户经常在搜索词中包含(相关)标点符号。这通常会导致结果估计与实际的过滤结果计数完全不同。

鉴于我知道我将要运行的搜索的性质,我想做的是配置通用索引以反映这一点。在这种情况下,我从来没有不想运行标点不敏感的搜索,因此似乎将 ML 配置为包含标点字符作为“单词字符”以构建其术语列表将使估计与实际匹配更接近。

我还没有找到任何配置 ML 来构建通用索引的方法(我假设会有“快速标点敏感搜索”选项);我什至尝试使用标点符号敏感排序规则创建一个单词词典,希望 ML 将其用作如何配置它的术语列表生成的提示,但没有骰子。

在理想的世界中,我可以配置两个术语列表;一个标点符号敏感,一个不敏感,但就这个问题而言,只需在两者之间进行选择就足够了。

这样的事情可能吗?

4

1 回答 1

2

通用索引会索引标点符号,但仅适用于节点而不适用于words。单词查询的术语列表不包括标点符号,因为分词器将单词定义为不包含空格或标点符号的字符串。http://docs.marklogic.com/guide/search-dev/languages上的文档讨论了标记化。在http://docs.marklogic.com/guide/search-dev/custom-dictionaries他们还描述了如何使用自定义标记化和词干词典来修改该行为。但是,对于大多数语言,该功能仍然不允许单词包含标点符号。

那么你能做什么呢?这将有助于更多地了解应用程序域,准确理解为什么搜索对标点符号如此敏感。由于缺乏这些细节,我认为答案是以某种方式将单词术语转化为价值术语。这可能涉及内容丰富、将词项转换为值项以及使用标点敏感范围索引进行查询扩展的某种组合。

为了丰富内容,你能标记对标点敏感的单词和短语吗?如果关键术语类似于代码组,这可能会特别有效:例如foo$bar在其他文本中。通过将其标记为<psv>foo$bar</psv>您可能能够foo$bar在查询中检测到,然后使用标点符号敏感cts:element-value-query而不是单词查询。

鉴于额外的标记,您还可以psv使用标点敏感的排序规则创建范围索引。然后范围索引约束将映射psv:"foo$bar"到该索引上的范围查询词。

范围索引的另一个用途是查询时间扩展:将每个标点敏感词项转换OR为所有可能的值项中的一个。如果范围索引节点包含相对值,这将最有效。这种方法需要在应用程序代码中进行一些额外的工作,这必须确保正确的查询词使用正确的范围索引。这可以作为后处理步骤来完成search:parse,或者像xqysp这样的自定义解析器。核心思想是识别需要扩展的用户输入术语,然后使用查找中的值将cts:word-query术语替换为术语。cts:element-range-querycts:element-value-match

于 2013-07-22T17:12:55.297 回答