2015-11-05 159 views
2

我有这有这样的结构的一些XML文档:忽略CTS元素:搜索

<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>,或者有什么其他方法来解决这个问题吗?

回答

5

这里的问题是符号化。 “二氧化碳”是一个单词的标记。 CO < sub> 2 </sub>,即使是短语贯穿,也是两个单词记号的短语:“CO”和“2”。就像“黑鸟”不符合“黑鸟”一样,“二氧化碳”也不符合“二氧化碳”。短语贯穿设置意味着我们愿意寻找一个跨越< sub>元素边界的短语。

您不能将CO>sub> 2 </sub>拼接在一个标记中,但是您可以使用自定义标记替代将“CO2”分解为两个标记。定义一个字段并将数字的覆盖定义为'符号'。这将使每个数字成为自己的标记,并将在该字段的上下文中将“CO2”分解为两个令牌。然后,您需要用字段查询替换字查询。

您可能不希望它适用于文档中的任何位置,因此您最好在文档中的这些类型的化学短语上添加标记。一般而言,字段和标记化覆盖尤其会导致性能成本。一个字段的内容被完全分开索引,因此索引较大,并且标记化覆盖意味着我们必须在摄取和查询时都重新进行retokenize。这会使事情减慢一点(不是很多)。

+0

我觉得有趣的是ML在上标记了一个短语(对我来说)建议忽略标记。 –

+1

索引在树模型上运行,而不是在标记的字符表示上。所以有一个内在的突破,因为有一个完全不同的文本节点。我认为有些案例(比如这样)需要一个“单词通过”来将令牌拼接在一起,但这并不总是正确的做法。 – mholstege

+0

HI Mary - 完美 - 所以短语贯穿元素中的项目仍然是单独的节点。说得通。谢谢! –

2

看来您想要添加phrase-through配置。

例子:

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

<b>短语,通过将被收录为“生存还是毁灭

+0

我已经为'sub'创建了一个phrase-through。即使在那之后,它也没有按预期工作。 –