2014-11-08 2 views
0

"int를 문자열로 변환"과 "정수를 문자열로 변환"모두에서 작동하도록 lucene 쿼리를 프레임해야합니다. 또한 일치하는 결과에서 용어 사이에 더 많은 단어가있을 수 있습니다. 예를 들어 "적절한 int를 잘 형식화 된 문자열로 변환하는 방법"을 예로들 수 있습니다.구문 순서가 slop이고 OR 절이있는 Lucene 쿼리

Query query = new SpanNearQuery(new SpanQuery[] { 
       new SpanTermQuery(new Term("title", "convert")), 
       new SpanTermQuery(new Term("title", "int")), 
       new SpanTermQuery(new Term("title", "string")) 
       }, 
       50, 
       true);   
    return query; 

을 다음과 같은 :

MultiPhraseQuery mpq = new MultiPhraseQuery(); 
    mpq.setSlop(50); 
    mpq.add(new Term("title","convert"));  
    mpq.add(new Term[]{new Term("title","int"),new Term("title", "integer")});   
    mpq.add(new Term("title","string"));    
    return mpq; 

또한 다음 중

BooleanQuery bq = new BooleanQuery();   
    bq.add(new TermQuery(new Term("title","convert")), Occur.MUST); 
    BooleanQuery idFilter = new BooleanQuery(); 
    idFilter.setMinimumNumberShouldMatch(1); 
    idFilter.add(new TermQuery(new Term("title", "int")), BooleanClause.Occur.SHOULD); 
    idFilter.add(new TermQuery(new Term("title", "integer")), BooleanClause.Occur.SHOULD);   
    bq.add(idFilter, BooleanClause.Occur.MUST); 
    bq.add(new TermQuery(new Term("title","string")), Occur.MUST); 
    return bq; 

아무도 내가 무엇을해야 할 것없는 나는 다음 시도했다. 누군가가 용어의 순서를 모두 포함하고 "OR"조건을 지정할 수있는 유효한 쿼리를 작성할 수 있습니까? 감사.

+0

처음 두 번 시도하면 좋게 보이고 효과가 있어야합니다. 그러나 모든 것이 분석기에 달려 있기 때문에 분석 방법을 보려면 [Luke tool] (https://github.com/DmitryKey/luke)을 사용하여 색인을 열어야합니다. 이것은 당신에게 무엇이 잘못되었는지 더 많은 단서를 줄 것입니다. –

+0

첫 번째 시도에서 int/integer에 대해 "OR"를 언급 할 방법이 없습니다. 두 번째 시도에서는 순서가 무시됩니다. –

+0

나는이 질문에 대해 오해하고있다. 그리고 네, 두 번째 경우에는 질서 때문에 질서가 무시됩니다. –

답변

0

첫 번째 시도는 마크와 가장 비슷합니다. 거기에 걸림돌은 int 대 정수를 처리하는 방법입니다.

두 가지 접근 방식이 마음에 듭니다. 가장 좋은 방법은 SynonymFilter을 분석기에 통합하는 것입니다. 이렇게하면 인덱스 시간에 integerint으로 자동으로 변환하는 동의어를 설정하여보다 복잡한 쿼리 논리가 필요하지 않게됩니다.

엄밀히 말하면 쿼리 작성에 설정하면 부울 쿼리를 범위 쿼리로 래핑하는 방법을 알 수 없지만 와일드 카드 또는보다 정확하게 접두사 쿼리는 int OR integer 상당히 동일하지 않을 수

Query query = new SpanNearQuery(new SpanQuery[] { 
     new SpanTermQuery(new Term("title", "convert")), 
     new SpanMultiTermQueryWrapper(new PrefixQuery(new Term("title", "int"))), 
     new SpanTermQuery(new Term("title", "string")) 
    }, 
    50, 
    true); 
return query; 

int*, 그러나 희망은 충분히 가까이하십시오 SpanMultiTermQueryWrapper에 포장하여 SpanNearQuery에서 사용할 수있는 목적, 같은 것을 제공합니다.