我有一个搜索应用程序,由于文档的性质,用户经常在搜索条件中包含(相关)标点符号。这通常会导致结果估计与实际的过滤结果计数完全不同。
我想做什么,因为我知道我将要运行的搜索的性质,是配置通用索引来反映这一点。在这种情况下,我从不想要运行标点符号不敏感搜索,因此似乎将ML配置为包含标点符号作为“单词字符”以构建其术语列表将使估计值匹配实际比赛更紧密。
我无法找到任何方法来配置ML来构建通用索引(我假设有一个“快速标点符号敏感搜索”选项);我甚至尝试使用标点符号敏感的排序法创建一个单词词典,希望ML可以使用它作为如何配置它的术语列表生成的提示,但没有骰子。
在理想的世界中,我可以配置两个术语列表;一个标点符号敏感,一个不符号,但就本问题而言,只需在两者之间进行选择即可。
这样的事情可能吗?
答案 0 :(得分:2)
通用索引会对标点符号进行索引,但仅针对节点值而不是单词。单词查询的术语列表不包括标点符号,因为标记生成器将单词定义为不包含空格或标点符号的字符串。 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-query
术语cts:element-value-match
术语。