2009-03-03 3 views
5
string q = "m"; 
Query query = new QueryParser("company", new StandardAnalyzer()).Parse(q+"*"); 

쿼리 발생하는 prefixQuery되는 : 기업 : A * 따라서왜이 Lucene 쿼리는 "startsWith"대신 "contains"입니까?

여전히 나는 A가 시작되지 않습니다 오히려 분명하다 "함대 아프리카"와 같은 결과를 얻을 수

및 것은 나에게 바람직하지 않은 결과를 제공합니다 .

Query query = new TermQuery(new Term("company", q+"*")); 

결과 검색어는 termQuery : company : a *가되고 결과는 반환되지 않습니다. 아마도 그것은 쿼리를 정확한 일치로 해석하고 내 값 중 어느 것도 "a *"리터럴이 아니기 때문일 수 있습니다.

Query query = new WildcardQuery(new Term("company", q+"*")); 

는 prefixquery와 동일한 결과를 반환합니다.

내가 뭘 잘못하고 있니?

답변

0

짧은 답변 : 모든 검색어가 검색 시작을 필드의 시작으로 제한하지 않습니다. EdgeNGramTokenFilter 또는 이와 비슷한 것이 필요합니다. Lucene에서 자동 완성 구현에 대해서는 this question을 참조하십시오.

+0

분명히 예가 너무 멀리 있습니다. 맞습니까? 모든 fuzz없이 쿼리와 같은 startswith를 만드는 것이 가능하지 않습니까? –

+0

내가 아는 것은 아닙니다. startswith는 까다 롭습니다. 이 작업을 수행 할 수 있다면 알려 주시기 바랍니다. 내가보기에, PrefixQuery는 단지 첫 번째가 아니라 모든 용어의 시작을 찾는 것을 의미합니다. –

+0

사실 놀랍게도. Startswith가 가장 쉬운 쿼리 여야합니다. –

4

StandardAnalyzer는 "Fleet Africa"를 "fleet"및 "africa"로 토큰 화합니다. 귀하의 a * 검색은 다음 학기와 일치합니다.

"Fleet Africa"를 하나의 단일 용어로 사용하려면 공백에서 문자열을 분리하지 않는 분석기를 사용하십시오. KeywordAnalyzer가 하나의 예이지만 쿼리에서 대소 문자를 구분하지 않도록 데이터를 소문자로 유지하려고 할 수도 있습니다.