Ank*_*waj 2 xquery full-text-search marklogic marklogic-8
我有一些xml文档,其结构如下:
<root>
<intro>...</intro>
...
<body>
<p>..................
some text CO<sub>2</sub>
.................. </p>
</body>
</root>
Run Code Online (Sandbox Code Playgroud)
现在我想用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)
Run Code Online (Sandbox Code Playgroud)
但是使用这个我无法获得文档CO<sub>2</sub>.我只用简单的短语获取数据CO2.
如果我替换搜索短语,CO 2那么我只能使用CO<sub>2</sub>而不是使用CO2
我想获得两者的组合数据CO<sub>2</sub>和CO2搜索结果.
我可以<sub>通过任何方式忽略,还是有其他方法来解决这个问题?
小智 5
这里的问题是标记化."CO2"是单字令牌.CO <sub> 2 </ sub>,即使使用短语,也是两个单词标记的短语:"CO"和"2".正如"黑鸟"与"黑鸟"不匹配一样,"二氧化碳"也与"二氧化碳"不匹配.短语通过设置只意味着我们愿意寻找跨越<sub>元素边界的短语.
您不能将CO <sub> 2 </ sub>拼接到一个令牌中,但您可以使用自定义标记化覆盖将"CO2"分解为两个令牌.定义一个字段并将数字的覆盖定义为"符号".这将使每个数字成为自己的标记,并在该字段的上下文中将"CO2"分解为两个标记.然后,您需要使用字段 - 单词查询替换单词查询.
您可能不希望将其应用于文档中的任何位置,因此您最好在文档中添加这些化学短语的标记.一般而言字段和令牌化覆盖尤其会以性能成本出现.字段的内容完全分开索引,因此索引更大,并且标记化覆盖意味着我们必须在摄取时和查询时重新标记.这会减慢一些事情(不是很多).