2015-11-05 196 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。即使在那之後,它也沒有按預期工作。 –