2010-03-12 8 views
3

Lucene과 관련된이 질문이 있습니다.Lucene 와일드 카드 쿼리

양식이있어서 텍스트를 가져 와서 여러 필드에서 전체 텍스트 검색을 수행하려고합니다. 입력에서 "textToLook"이라는 텍스트를 얻는다 고 가정합니다.

나는 Lucene Analyzer에 몇 가지 필터가 있습니다. 그 중 하나는 lowerCaseFilter이므로 색인을 만들면 단어가 소문자로 변환됩니다.

나는 루씬 쿼리는 이런 일이 ('textToLook은'지금 'texttolook'이다) 될 수 있도록 두 개의 필드 필드 1과 FIELD2으로 검색 할 상상 : 내가 뭔가를 내 수업에서

field1: texttolook* field2:texttolook* 

이렇게하면 쿼리를 만들 수 있습니다. 와일드 카드가 없을 때 작동합니다.

field1: texttolook field2:texttolook 

을하지만 텍스트를 설정하면 "textToLook는 *"나는 인덱스로 제대로 찾을 수 없을 것이다

field1: textToLook* field2:textToLook* 

를 얻을 :이 코드

String text = "textToLook"; 
String[] fields = {"field1", "field2"}; 
//analyser is the same as the one used for indexing 
Analyzer analyzer = fullTextEntityManager.getSearchFactory().getAnalyzer("customAnalyzer"); 
MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, analyzer); 
org.apache.lucene.search.Query queryTextoLibre = parser.parse(text); 

쿼리가 될 것이다 소문자입니다.

나는 루씬 웹 사이트에서 읽은이 :

"등의 형태소로 운영 및 lowercasing을 수행하는 구성 요소 인 분석기, 를 통해 전달되지 않습니다 와일드 카드, 접두어 및 퍼지 쿼리를"

문제는 대소 문자를 구분하지 않으므로 문제를 해결할 수 없습니다. 분석기에는 단어의 일부 접미어를 제거하는 다른 필드가 있습니다.

필자는 필자의 분석기 필터를 통과 한 후 텍스트가 어떻게 나타나는지를 알면 문제를 해결할 수 있다고 생각하고 "*"를 추가 한 다음 MultiFieldQueryParser를 사용하여 쿼리를 작성할 수 있습니다. 그래서이 예제에서 나는 "textToLower"를 얻었고이 필터들에 전달 된 후에 "texttolower"를 얻을 수있었습니다. 이 후에 나는 "textotolower *"를 만들 수 있었다.

그러나 모든 분석기의 필터를 통과 한 후 내 텍스트 변수의 값을 가져 오는 방법이 있습니까? 분석기의 모든 필터는 어떻게 얻을 수 있습니까? 이것이 가능한가?

감사

답변

1

당신은 QueryParser.setLowercaseExpandedTerms (true)를 사용할 수 있습니까?

http://wiki.apache.org/lucene-java/LuceneFAQ#Are_Wildcard.2C_Prefix.2C_and_Fuzzy_queries_case_sensitive.3F

는 ** 수정 **

좋아, 지금은 문제를 이해합니다. 와일드 카드 검색어를 실행하기 전에 실제로 와일드 카드로 표시된 용어를 줄기를 원합니다.

당신은 QueryParser를 서브 클래스와 WildcardQuery가 구축되기 전에

protected Query getWildcardQuery(String field, String termStr) throws ParseException 

이 분석기를 통해 termStr을 실행하는 데 무시할 수 있습니다.

그러나 이것은 사용자가 기대하는 바가 아닐 수 있습니다. 그들은 분석기를 통해 와일드 카드 조건을 실행하지 않기로 한 이유는 자주 묻는 질문 당,있다 :

분석기 을 건너 뛰는 이유는 당신이 을 찾고 있다면 "개 *"당신이 원하는하지 않을 것입니다 "개" 은 먼저 "dog"에 줄기를 붙였습니다. 그 이유는 은 "dog *"와 일치 할 것이기 때문이며, 이것은 의도 한 쿼리가 아닙니다.

+0

나는 이것을 이미 보았지만 문제를 해결하지 못했다. 소문자 필터보다 많은 필터가 있습니다. 내가 그 중 하나는 단어의 접미사를 제거 언급했듯이, 예를 들어 "changeable"로 색인을한다면 그것은 "변경"으로 색인이 될 것이므로 쿼리에서 "변경 사항"을 검색하면 단어의 루트 (" 변경 ")을 찾고"변경 * "을 찾으면이 단어들이 일치합니다. – Javi