2012-08-03 3 views
2

거대한 XML 파일이 BaseX에 저장되어 있습니다. 다음 는이 두 XQuery의 차이점

Datas (Parent Node) 
    - Data (Child of above) 
    - Desc (Child of above) 
     - P (Child of above) and contains the actual text 

P 태그는 모든 텍스트가 포함 된 XML 노드의 구조와 나는 P 태그 내부 입니다 특정 단어의 발생 수를 계산해야합니다.

전 텍스트 색인을 만들었습니다. 이제 특정 단어의 발생을 계산하려면 다음과 같은 2 개의 쿼리를 사용하고 있습니다.

ft:count(doc('BHCR')/Datas/Data/Desc[. contains text 'revolution']) 

이 쿼리는 2177을 반환하고 25 초가 걸렸습니다.

또 하나

ft:count(doc('BHCR')/Datas/Data/Desc[text() contains text 'revolution']) 

이 쿼리는 3684를 반환하고 52 millisec했다.

어느 것이 옳은가요? 아무도이 두 쿼리의 차이점을 설명 할 수 있습니까? 첫 번째 쿼리에서

답변

2

은, 상황에 맞는 항목 .는 전체 텍스트 토큰을 찾는 데 사용됩니다 (그 문자열 값의 창조, 즉) 요소의 모든 텍스트 노드의 병합으로 이어질 것입니다 . 이 병합으로 인해 새 키워드가 생성 될 수 있습니다. 예를 들어, 다음 쿼리는

새 키워드로
<xml><b>H</b>i</xml> contains text 'hi' 

전체에 저장 될 수 없습니다 ... 다음 쿼리로

<xml><b>H</b>i</xml>/. contains text 'hi' 

..where는 true를 돌려줍니다 ... true를 돌려줍니다 -text 인덱스를 사용하면 인덱스 액세스가 발생하지 않으며 쿼리가 훨씬 오래 걸립니다.

두 번째 쿼리는 자식 텍스트 노드에 revolution이있는 모든 Desc 요소를 반환합니다. 당신이 Desc 모든 요소를 ​​내림차순 텍스트를 구문 분석하려면 다음 쿼리는 당신에게 예상되는 결과를 줄 것이다 :

ft:count(doc('BHCR')/Datas/Data/Desc[.//text() contains text 'revolution'] 

BaseX 문서의 Full Text: Mixed Context 섹션은 당신에게 더 많은 정보를 제공 할 것입니다.

희망이 도움이, 기독교

+0

기독교 - 답장을 보내 주셔서 감사합니다. 흠 이제 나는 그것을 얻었다. BTW, 귀하의 쿼리는 3684 카운트와 88 MS했다. 다시 한번 감사드립니다 :) –