忽略cts中的元素:搜索

时间:2015-11-05 03:49:30

标签: full-text-search xquery marklogic marklogic-8

我有一些xml文档,其结构如下:

<root>
  <intro>...</intro>
   ...
  <body>
    <p>..................
       some text CO<sub>2</sub>
       .................. </p>
   </body>
</root>

现在我想用CO2短语搜索所有结果,并希望在搜索结果中获得上述类型的结果。 为此,我正在使用此查询 -

cts:search 
(fn:collection ("urn:iddn:collections:searchable"), 
cts:element-query
          (
            fn:QName("http://iddn.icis.com/ns/fields","body"), 
            cts:word-query
            (
              "CO2", 
              ("case-insensitive","diacritic-sensitive","punctuation-insensitive",
                "whitespace-sensitive","unstemmed","unwildcarded","lang=en"),
              1
            )
          )
, 
("unfiltered", "score-logtfidf"), 
0.0)

但是使用这个我无法获得CO<sub>2</sub>的文档。我只使用简单的短语CO2获取数据。

如果我将搜索词组替换为CO 2,那么我只能使用CO<sub>2</sub>而不是CO2来获取文档

我希望将CO<sub>2</sub>CO2的合并数据作为搜索结果。

我可以通过任何方式忽略<sub>,还是有其他方法可以解决这个问题?

2 个答案:

答案 0 :(得分:5)

这里的问题是标记化。 “CO2”是单字令牌。 CO&lt; sub&gt; 2&lt; / sub&gt;,即使使用短语,也是两个单词标记的短语:“CO”和“2”。正如“黑鸟”与“黑鸟”不匹配一样,“二氧化碳”也与“二氧化碳”不匹配。短语通过设置只意味着我们愿意寻找跨越&lt; sub&gt;的短语。元素边界。

你不能拼凑CO&lt; sub&gt; 2&lt; / sub&gt;一个令牌,但您可以使用自定义标记化覆盖将“CO2”分解为两个令牌。定义一个字段并将数字的覆盖定义为“符号”。这将使每个数字成为自己的标记,并在该字段的上下文中将“CO2”分解为两个标记。然后,您需要使用字段查询替换单词查询。

您可能不希望将其应用于文档中的任何位置,因此您最好在文档中添加这些化学短语的标记。一般而言字段和标记化覆盖尤其会产生性能成本。字段的内容完全分开索引,因此索引更大,并且标记化覆盖意味着我们必须在摄取时和查询时重新标记。这会减慢一些事情(不是很多)。

答案 1 :(得分:2)

您似乎想要添加phrase-through配置。

示例:

<p>to <b>be</b> or not to be</p> 

<b>上的词组表达式将被编入索引为“是否为