通配符仅搜索特定元素

TJ *_*ang 3 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>
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*nis 5

你走在正确的轨道上.让我们对"TS Tan"进行元素(或可能是字段)查询

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

然后我有"TS"和"Tan"

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

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

我们有时会更进一步,并将查询构建与xdmp:estimate结合起来,如果我们在早期得不到足够的结果,则会使查询的限制性降低.

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