2012-12-18 2 views
0

미국, 미국 및 미국을 포함하는 아메리카 합중국에 대한 동의어 사전 항목이 있다고 가정 해 보겠습니다. 가장 좋은 예는 아니지만 아이디어를 얻습니다. 사용자가 미국 정부를 검색합니다. thsr : expand 함수로 전달하기 위해이 문자열을 어떻게 파싱합니까?
"미국 정부"는 효과가 없으며 내가 원하는 것도 아닙니다. 미국 정부와 미국 정부의 문서가 반환되도록 "미국"에 대한 시소러스 입증을 원합니다. 미리 감사드립니다.구문에 MarkLogic 시소러스 API를 어떻게 사용합니까?

답변

1

최근에 변경하지 않은 한 thsr:expand은 여러 단어의 시소러스 용어로 작동하지 않습니다. 그러나, 자신의 다중 단어 시소러스 확장을 롤백하는 것이 가능합니다.

솔루션에 대한 몇 가지 단계가 있으며 실제로 MarkLogic World 프레젠테이션의 예제로 Search Intelligence and MarkLogic API이라고 썼습니다. 앞뒤로 건너 뛰려면 여러 단어로 된 시소러스 예제가 슬라이드 32에서 시작됩니다.

all the code from the presentation up on Github도 입력하겠습니다.

요점은 다음과 같습니다. 먼저 search:parse을 입력하고 cts : query XML을 "실행"이 포함 된 중간 유형 XML로 변환합니다 (WordML에 익숙한 경우). 그런 다음 실행은 cts:highlight과 동의어 사전 용어의 OR 쿼리를 사용하여 확장됩니다. 마지막으로 나머지 실행은 cts : query XML로 다시 확인되고 search:resolve을 사용하여 검색됩니다.

꽤 빠르지 만 시소러스가 정말 큰 경우 일부 최적화로 속도가 향상 될 수 있습니다.

업데이트 인용 부호로 둘러싸이지 않은

난 그냥 내 예제와 에드 워드 쿼리의 OR 쿼리에 인용 부호가없는 문구를 확장하는 동안은, 다수의 인용 구문 동의어로 확장 인용 문구를 시도 할 수 있다는 것을 발견 (실없는 말).

당신은 실제로 실행 생성/해결 단계를 건너 뛰고 문구에 직접 작동 무언가로 exprun:thsr-expand-runs를 재 작업 수 :

declare function exprun:thsr-expand-phrases(
    $q as item(),  (: cts:query XML :) 
    $q-thsr as item() (: thesaurus terms :) 
) as item() 
{ 
    typeswitch($q)  
     case element(cts:word-query) return 
      if (not($q[@qtextpre and @qtextpost])) then $q 
      else (: this is a phrase :) 
      cts:highlight($q, $q-thsr, 
       if (count($cts:queries) gt 1) 
       then xdmp:set($cts:action, "continue") (: ignore matches within matches :) 
       else   
        element cts:word-query { 
        $q/namespace::*, $q/@*, $q/node(), 
        let $expanded-text := 
         cts:highlight($q/cts:text, $q-thsr, 
          if (count($cts:queries) gt 1) 
          then xdmp:set($cts:action, "continue") 
          else thsr:lookup("/config/jmp-thesaurus.xml", 
           cts:word-query-text($cts:queries[1])//thsr:synonym/thsr:term/string() 
        ) 
       where ($expanded-text ne $q/cts:text) (: found matches :) 
       return ($expanded-text, 
        element cts:option { 'synonym' }) 
      } 
     else $q 
    case text() return $q 
    default return 
     element {node-name($q)}{ 
      $q/namespace::*, 
      $q/@*, 
      exprun:thsr-expand-phrases($q/node(), $q-thsr) 
     } 

};

당신은 여전히이 기능을 시소러스 용어의 cts:or-query를 제공해야합니다 :

cts:or-query(doc('thesaurus.xml')//thsr:entry/thsr:term/cts:word-query(string(.))))) 

이는하지만, 인용 문구에 작동합니다. 따라서 인용되지 않은 구문을 조작하고 싶다면 실행을 만들어야합니다. 두 버전 모두에서 작동하려면 github 예제 코드를 약간 변경해야합니다 (따옴표 붙은 문구는 건너 뜁니다).