2012-11-07 3 views
0

쿼리 할 수있는 Lucene 인덱스 설정이 있습니다. "필드가 빈 문자열과 같지 않음"상태로 작동하지 못합니다. "국가 태그"필드는 "{4ED2F7EE - 5C2A-418C-B2F6-236F94166BA1}"포함하는 경우 아래의 코드 표본에서 예를 들어, 나는 3 조건Lucene.net에서 빈 문자열 필드를 포함하고 쿼리하지 않습니다.

  1. 을 갖고 싶어.
  2. "국가 태그"필드는 빈 문자열이 아닙니다.
  3. 여기서 "날짜"범위는 "20110101T000000"과 "20121001T000000"사이입니다.

    WildcardQuery taggingQuery = new WildcardQuery(new Term("country tag", "*" + ShortID.Encode("{4ED2F7EE-5C2A-418C-B2F6-236F94166BA1}").ToLowerInvariant() + "*")); 
        TermQuery taggingNotQuery = new Term("country tag", " ")); 
    
        RangeQuery rangeQuery = new RangeQuery(new Term("date", "20110101T000000"), new Term("date", "20121001T000000"), true); 
    
        BooleanQuery booleanQuery = new BooleanQuery(); 
        booleanQuery.Add(taggingQuery, BooleanClause.Occur.MUST); 
        booleanQuery.Add(taggingNotQuery, BooleanClause.Occur.MUST_NOT); 
        booleanQuery.Add(rangeQuery, BooleanClause.Occur.MUST); 
    

나는 내가이 잘못하고 있어요 느낌이 또는 내 쿼리는 어떻게 든 잘못된 것입니다. 빈 필드 또는 null 필드를 찾아야하는 조건이 필요하지 않습니다.

도움을 주시면 감사하겠습니다.

+0

국가가없는 색인에 문서를 쓰는 데 사용하는 코드를 표시 할 수 있습니까? – Prescott

+0

coutry 태그 필드를 문서에 여러 번 추가합니까? 그렇다면 MUST_NOT 절이 필요 없다. Btw MUST_NOT은 빈 문자열이 아닌 공백을 검사합니다. 마지막으로, 말하고있는 것에서는 빈 문자열이있는 필드를 추가하지 말고 필드에 문서를 추가하지 마십시오. –

답변

0

색인을 설정할 때 좀 더주의를 기울여야합니다. 각 필드에 필드 분석기를 추가하는 것을 잊어 버렸습니다. 다중 분석기 필드는 표준 분석기 대신 다른 분석기로 인덱싱됩니다. 필드 크롤링에 대한 설정 섹션에이 내용을 추가하고 쿼리가 작동하기 시작했습니다.

<fieldTypes hint="raw:AddFieldTypes"> 
        <!-- Text fields need to be tokenized --> 
        <fieldType name="single-line text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="multi-line text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="word document" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="html" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="rich text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="memo" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <!-- Multilist based fields need to be tokenized to support search of multiple values --> 
        <fieldType name="multilist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="treelist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="treelistex" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="checklist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <!-- Legacy tree list field from ver. 5.3 --> 
        <fieldType name="tree list" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
       </fieldTypes> 
0

당신은 허용 할 경우 '*'검색 문자열의 첫 번째 문자, 루씬은 "countrytag : *"와 같은 쿼리를 사용할 수 있습니다로 countrytag 필드에서 아무것도를 포함하는 모든 문서를 찾을 수 있습니다. (Lucene의 기본값은 쿼리 문자열에서 초기 '*'을 비활성화하는 것입니다.)

+0

WildQuery query = new WildQuery ("country tag", "* [GUID] *")를 사용하려고했습니다. 그러나 그것은 작동하지 않았다. 이 쿼리는 다른 범위 및 검색어와 함께 부울 쿼리에 추가됩니다. 또한 QueryParser를 사용하여 인기 스타를 허용했지만 그 중 하나도 작동하지 않았습니다. 국가 태그 필드는 StandardAnalyzer에 의해 분석되고 GUID 값의 문자열입니다. 분석이 끝나면 "ASDF342SDFAS 2342LJLJ1"로 추가됩니다. GUID는 단지 샘플 일뿐입니다. 실제 값은 하이픈과 중괄호가없는 실제 GUID입니다. 나는이 일을 지금 당장 끝내지 못한다. – Gabbar

+0

또한 검색하려고하는 값은 예를 들어 23LKLL233에서와 같이 분석 된 필드 형식으로 변환됩니다. – Gabbar

관련 문제