2013-06-06 2 views
0

이의 내가루씬 :

stringfield:123456 
textfield:name website stackoverflow 

같은 문서를 가지고 있고이 다음과 같은 방식으로 쿼리를 작성하면 예상대로

StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_42); 
QueryParser luceneQueryParser = new QueryParser(Version.LUCENE_42, "", analyzer); 
Query luceneSearchQuery = luceneQueryParser.parse("textfield:\"name website\""); 

가이 문서를 반환한다고 가정 해 봅시다 하나의 용어에 여러 단어, 하지만 Lucene QueryAPI를 사용하여 쿼리를 작성하는 경우

PhraseQuery firstNameQuery = new PhraseQuery(); 
    firstNameQuery.add(new Term("textfield","name website")); 

아무런 결과도주지 않을 것입니다. "name website"를 토큰 화해야합니다. 각 토큰을 phrasequery에 추가하십시오.

String Query를 구문 분석하는 동안 QueryAPI가 토큰 화하는 기본 방법이 있습니까? 물론 나 자신을 할 수 있지만 이미 구현되어 있다면 바퀴를 재발견하십시오.

답변

2

전체 검색어를 PhraseQuery에 단일 검색어로 추가합니다. 당신은 바른 길을 가고 있습니다, 그러나 토큰 화되었을 때 그것은 단 하나의 용어가 아니라 오히려 두 개가 될 것입니다. 그게 당신의 지수는 이름, 웹 사이트유래하지만 쿼리 만 이름의 웹 사이트 전혀 일치하지 않습니다 하나 개의 용어를 가지고 조건을 갖는다.

PhraseQuery를 사용하는 올바른 방법은 각 용어를 PhraseQuery에 별도로 추가하는 것입니다.

PhraseQuery phrase = new PhraseQuery(); 
phrase.add(new Term("textfield", "name")); 
phrase.add(new Term("textfield", "website")); 
0

때 :

luceneQueryParser.parse("textfield:\"name website\""); 

루씬은 문자열 "이름의 웹 사이트를"토큰 화하고,이 조건을 얻을 것이다.

때 :

new Term("textfield","name website") 

루씬 대신 용어로 전체를 사용, 문자열 "이름의 웹 사이트를"토큰 화되지 않습니다.

당신이 말한 결과로, 문서를 색인 할 때, 필드 텍스트 필드는 반드시 색인화되고 토큰 화되어야합니다.