如何在Marklogic Server中创建数据库字段?

时间:2012-05-07 08:39:01

标签: xml field marklogic

我有以下xml结构

 <patent-assignors>
        <patent-assignor>
          <name>VOLPENHEIN, ROBERT A.</name>
          <execution-date>
        <date>19841204</date>
          </execution-date>
        </patent-assignor>
 </patent-assignors>


    <patent-assignees>
        <patent-assignee>
          <name>PROCTER &amp; GAMBLE COMPANY, THE</name>
          <address-2>A CORP. OF  OHIO</address-2>
          <city>CINCINNATI</city>
          <state>OHIO</state>
        </patent-assignee>
   </patent-assignees>

我想在Marklogic Server中为patent-assignor&amp;创建一个数据库字段。 patent-assignee  这样我就可以使用cts:field-word-query。但我想搜索专利转让人和专利受让人的名称(两者都包含相同的元素“name”)。任何人都可以告诉我如何将专利转让人的字段映射到专利转让人姓名和专利受让人的专利受让人名称,以便我可以cts:field-word-query使用专利转让人和专利受让人的姓名。我想要完全匹配。

2 个答案:

答案 0 :(得分:2)

这听起来并不像Field索引的用例。只需在元素“name”上放置索引,两个案例都将在同一索引中编入索引。要进行区分,请将word-queryvalue-queryelement-query包装为适当的父元素。

答案 1 :(得分:1)

我认为上面关于确保您了解可用选项的评论都非常重要。如果我正确理解您的问题,MarkLogic可能只使用“通用索引”来回答您的搜索。

由于转让人和受让人都使用名为“name”的元素,因此查询完全匹配非常简单(完全匹配通常意味着value-query而不是word-query

cts:element-value-query(xs:QName("name"), "VOLPENHEIN, ROBERT A.")

但是,如果您的数据中除了转让人和受让人之外还有更多“name”元素,并且您需要缩小匹配范围,只能来自这些而不是其他“name”字段使用element-queries限制搜索(为了使其扩展顺利,请确保将数据库中的element-word-positionselement-value-positions设置设置为true)

cts:or-query((

    cts:element-query( xs:QName("patent-assignor"), 
                       cts:element-value-query(
                           xs:QName("name"), 
                           "VOLPENHEIN, ROBERT A.")),

    cts:element-query( xs:QName("patent-assignee"), 
                       cts:element-value-query(
                           xs:QName("name"), 
                           "VOLPENHEIN, ROBERT A."))
))

在隔离特定元素方面,字段可能非常强大,特别是当存在复杂的“包含”和“排除”逻辑时。我认为你很可能只需使用“通用索引”在查询时进行过滤就可以保持更灵活。