通用索引会索引标点符号,但仅适用于节点值而不适用于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-query
cts:element-value-match