2010-01-15 6 views
1

Lucene java QueryParserKeywordAnalyzer과 함께 사용합니다. topic:(hello world)과 같은 검색어는 KeywordTokenizer에 의해 여러 부분으로 나뉘어져 결과 검색어 개체는 topic:(hello) topic:(world)과 같이 표시됩니다. 즉 하나 대신 두 개의 키 - 값 쌍이 있습니다. QueryParser은 큰 따옴표를 사용하지 않고 hello world을 하나의 값으로 해석하겠습니다. 그렇게하는 가장 좋은 방법은 무엇입니까?KeywordTokenizer가 여러 키 - 값 쌍을 생성하지 못하도록

구문 분석 topic:("hello world")은 단일 키 값 조합으로 나타나지만 큰 따옴표를 사용하면 옵션이 아닙니다.

나는 Lucene 검색 엔진을 사용하지 않습니다. 쿼리를 구문 분석하기 위해 Lucene의 QueryParser를 사용하고 있습니다. 검색을 위해서가 아닙니다. 텍스트 Hello World은 런타임시 사용자가 변경할 수 있도록 입력됩니다. KeywordTokenizerHello World을 두 개의 토큰으로 분할하는 대신 하나의 토큰으로 처리하는 것이 좋습니다.

+0

검색어 구문 분석기를 호출하는 방법을 지정하는 코드 스 니펫을 추가 할 수 있습니까? 사용자 지정 쿼리 파서를 직접 작성하거나 따옴표를 전처리 단계로 추가 할 수 있다고 생각합니다. 그렇지 않다면 이유가 무엇인지 설명하십시오. –

+0

QueryParser qp = 새 QueryParser ("알 수 없음", 새 KeywordAnalyzer()); qp.setDefaultOperator (QueryParser.AND_OPERATOR); 쿼리 쿼리 = qp.parse (aString); aString은 웹 응용 프로그램 사용자가 제공합니다. aString이 주제 인 경우 : 안녕하세요. 주제 : hello 주제 : world – RHT

+0

내 웹 응용 프로그램 사용자는 aString을이 주제와 같은 큰 따옴표로 묶을 수 있습니다 ("hello world"). 그러면 두 개가 아닌 하나의 Term 객체를 사용할 수 있습니다. 하지만 그 용어는 완벽하지 않습니다. 자동으로 큰 따옴표와 그 결과 키를 잘라냅니다. 값은 큰 따옴표가없는 topic : hello world처럼 보입니다. Lucene이 아닌 검색 엔진이 이러한 큰 따옴표를 사용하여 정확한 구문 검색을 수행하기 때문에 Query Parser에서 사용자가 입력 한 큰 따옴표를 제거하지 않기를 바랍니다. – RHT

답변

0

BooleanQuery을 사용해야합니다. Lucene의 .NET 포트를 사용하는 코드 스 니펫이 있습니다. 이 작업은 KeywordAnalyzer와 StandardAnalyzer 모두에서 작동합니다.

var luceneAnalyzer = new KeywordAnalyzer(); 

var query1 = new QueryParser("Topic", luceneAnalyzer).Parse("hello"); 
var query2 = new QueryParser("Topic", luceneAnalyzer).Parse("world"); 

BooleanQuery filterQuery = new BooleanQuery(); 
filterQuery.Add(query1, BooleanClause.Occur.MUST); 
filterQuery.Add(query1, BooleanClause.Occur.MUST); 

TopDocs results = searcher.Search(filterQuery); 
+0

Lucene 검색 엔진을 사용하지 않습니다. 쿼리를 구문 분석하기 위해 Lucene의 QueryParser를 사용하고 있습니다. 검색을 위해서가 아닙니다. 텍스트 헬로우 월드는 사용자가 런타임에 입력 할 수 있도록 입력됩니다. KeywordTokenizer가 Hello World를 두 개의 토큰으로 분할하는 대신 파싱하는 대신 하나의 토큰으로 취급하기를 원합니다. – RHT

+0

질문에 정확하게 대답하지는 않지만 제공 한 아름다운 설명과 작업 코드로 인해 질문을 선택합니다. 다른 사람들이 Lucene Query Parser를 시작하는 데 도움이됩니다. – RHT

+1

질문에 대한 답변을 수락하면 더 나아질 것입니다 - 저는 혼란에 빠졌습니다! – mcintyre321

0

다음과 같이 직접 쿼리를 구성 할 수 있습니다. 이것은 공간을 보존합니다.

Query query = new TermQuery(new Term("field", "value has space")); 

System.out.println(query);으로 인쇄하면 다음과 같은 결과가 표시됩니다.

field:value has space 
+0

감사합니다. 이것은 내가 필요로하는 것이 아니다. – RHT

관련 문제