通配符仅搜索特定元素

时间:2016-05-26 03:49:20

标签: search wildcard marklogic marklogic-8

我正在寻找一种在执行search:search时仅对特定元素进行通配符搜索的方法。具体来说,我的文档可能如下所示:

<pdbe:person-envelope xmlns:pdbe="http://schemas.abbvienet.com/people-db/envelope">
  <person xmlns="http://schemas.abbvienet.com/people-db/model">
    <costcenter>
      <code>0000601775</code>
      <name>DISC-PLAT INFORM</name>
   </costcenter>
    <displayName>Tj Tang</displayName>
    <upi>10025613</upi>
    <firstName>
      <preferred>TJ</preferred>
      <given>Tze-John</given>
   </firstName>
    <lastName>
      <preferred>Tang</preferred>
      <given>Tang</given>
   </lastName>
    <title>Principal Research Scientist</title>
  </person>
  <pdbe:raw/>
</pdbe:person-envelope>

当搜索发生时,我希望搜索文本自动通配,但仅适用于某些元素,如displayName,firstName,lastName,但不适用于upi或代码。据我了解,我会在数据库中启用某些与通配符相关的索引,但是我需要一个自定义查询解析器,将查询重写为每个元素的多个cts:element-querycts:element-value-query语句我想要通配符搜索,或者与最初解析的搜索查询进行OR运算。或者我可以创建字段约束,并重写查询以使用字段约束。

当用户输入简单的搜索查询时,有没有其他方法可以在某些元素上使用通配符进行条件搜索,而不是其他元素,即部分名字和姓氏“TJ Tan”,但是当我搜索时没有部分命中“ 100256" 。

1 个答案:

答案 0 :(得分:5)

你走在正确的轨道上。让我们对“TS Tan”

进行元素(或可能是字段)查询

使用cts:tokenize,你可以解决这个问题(阅读cs:tokenize - 它不仅仅是一个普通的标记器)。

然后我有“TS”和“Tan”

您可以执行诸如应该使用哪些单词以及哪些单词应该使用业务规则以及构建适当的cts查询(可能是和/或单个查询中的单个单词查询 - 或根据您的需要进行调整)

现在使用搜索词组标记化,您还可以认为您可能会发现构建结果不依赖于通配符索引,而是依赖于元素词词典 - 您使用word-matches进行术语扩展和那些然后将术语发送到查询。

我们有时会更进一步,将查询构建与xdmp:estimate结合起来,如果我们在早期没有得到足够的结果,那么查询的限制性就会降低。

在哪里放这个逻辑? 你提到搜索:搜索,所以在这种情况下,我建议你把它打包成一个自定义约束。