2009-07-06 2 views
10

현재 Lucene을 사용하여 색인에 채워진 데이터를 검색하려고합니다.Lucene - 와일드 카드 (구두)

정확한 구문을 대괄호 (예 : '문서 처리')로 묶어서 검색 할 수 있지만 Lucene이 '문서 처리 중 *'을 수행하여 해당 구문을 찾을 수 없습니다.

끝 부분에 와일드 카드가 있다는 명백한 차이점이 있습니다.

현재 Luke를 사용하여 색인을보고 검색하려고 시도하고 있습니다. "문서 *"

어떤을하지 않는 데이터가 *이 작동 문서 검색으로 주범 것 같다 주위에

는 따옴표를 추가 (그것은 구문 분석 할 때 문구의 끝에 별표 방울)하지만, 도움을 크게 주시면 감사하겠습니다.

+0

이것으로 해결할 수 있습니다. 가능한 해결 방법. 와일드 카드로 근접 검색을 수행 할 수있는 방법이 있습니까? 그래도 성능에 큰 타격을 줄 수 있습니다. –

답변

0

QueryParser는 구문에서 와일드 카드를 지원하지 않을뿐만 아니라 PhraseQuery 자체도 용어를 지원합니다. MultiPhraseQuery은 더 가깝지만 요약에 따르면 와일드 카드와 일치하도록 IndexReader.terms를 직접 열거해야합니다.

0

기본 QueryParser가 처리하지 못하는 것 같습니다. 와일드 카드 용 사용자 지정 QueryParser는 구문으로 만들 수 있습니다. 예를 대표하면, stemming가 문제를 해결할 수 있습니다. 적합 여부를 확인하려면 PorterStemFilter에 대한 설명서를 읽어보십시오.

0

또 다른 대안은 NGrams 및 특히 EdgeNGram을 사용하는 것입니다. http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory

이렇게하면 ngrams 또는 단어의 일부에 대한 색인이 만들어집니다. 5의 분 N- 그램의 크기와 8의 최대 N- 그램 크기 문서, 것 인덱스 : Docum DOCUME 문서 문서

인덱스 크기와 시간에 대한 트레이드 오프의 비트가 있습니다. Solr 설명서 중 하나가 대략적인 지침으로 인용되어 있습니다. 인덱싱에 10 배 길어집니다. 디스크 공간을 5 배 더 사용합니다. 6 배 더 분명한 용어를 만듭니다.

그러나 EdgeNGram은 그 이상을 수행 할 것입니다.

쿼리에 와일드 카드 문자를 제출하지 않아야합니다. 와일드 카드 검색을 수행하지 않으므로 ngrams (단어의 일부)에 검색어가 일치합니다.

0

나는 또한 동일한 것을 찾고 있었고 PrefixQuery는이 "Processing Document *"와 같은 몇 가지 조합을 제공합니다.하지만 당신이 찾고있는 분야는 untokenized해야하고 저장해야합니다. 소문자 (이유는 untokenized 인덱서가 소문자로 필드 값을 저장하지 않으므로 그 이유입니다).여기에 나를 위해 일한 PrefixQuery에 대한 코드는 다음과 같습니다 -

List<SearchResult> results = new List<SearchResult>(); 
Lucene.Net.Store.Directory searchDir = FSDirectory.GetDirectory(this._indexLocation, false); 
IndexSearcher searcher = new IndexSearcher(searchDir); 
Hits hits; 

BooleanQuery query = new BooleanQuery(); 
query.Add(new PrefixQuery(new Term(FILE_NAME_KEY, keyWords.ToLower())), BooleanClause.Occur.MUST); 
hits = searcher.Search(query); 
this.FillResults(hits, results);