2012-08-28 3 views
3

많은 양의 도시 이름에 대해 자동 완성 텍스트 상자를 만들려고합니다. 검색 기능은 다음과 같습니다. 여러 단어로 구성된 구문으로 "시작"검색을 원합니다. 예를 들어 사용자가 "chicago he"를 입력 한 경우 "Chicago Heights"와 같은 위치 만 반환해야합니다.
Lucene을 사용하려고합니다. 어떻게 구현해야하는지 이해하는 데 문제가 있습니다. 내가 무슨 생각을 해봤Lucene.net 및 부분 "starts with"구문 검색

가 작동해야하는 방법이다 :

doc.Add(new Field("Name", data.ToLower(), Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.NO)); 

을 검색하십시오 :

을 내가 KeywordAnalyzer와 위치를 색인 한 (I는 모두 UN_TOKENIZED을 토큰 화 및 시도했습니다) (다른 여러 가지 쿼리/분석기/등을 시도했습니다.)

var luceneQuery = new BooleanQuery(); 
var wildcardQuery = new WildcardQuery(new Term("Name", "chicago hei*")); 
luceneQuery.Add(wildcardQuery, BooleanClause.Occur.MUST); 

결과가 없습니다. 어떤 조언을 부탁드립니다.

+0

어떤 분석기를 사용하고 있습니까? – sisve

답변

3

필드를 인덱스로 지정하려면 Field.Index.NOT_ANALYZED 설정을 사용해야합니다. 이는 사용중인 UN_TOKENIZED와 동일하므로 작동해야합니다. 작동하는 샘플을 보면서 신속하게 테스트 해 보았습니다. 을 보장하기 위해 Nuget

IndexWriter iw = new IndexWriter(@"C:\temp\sotests", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), true); 

Document doc = new Document(); 
Field loc = new Field("location", "", Field.Store.YES, Field.Index.NOT_ANALYZED); 
doc.Add(loc); 

loc.SetValue("chicago heights"); 
iw.AddDocument(doc); 

loc.SetValue("new-york"); 
iw.AddDocument(doc); 

loc.SetValue("chicago low"); 
iw.AddDocument(doc); 

loc.SetValue("montreal"); 
iw.AddDocument(doc); 

loc.SetValue("paris"); 
iw.AddDocument(doc); 

iw.Commit(); 


IndexSearcher ins = new IndexSearcher(iw.GetReader()); 

WildcardQuery query = new WildcardQuery(new Term("location", "chicago he*")); 

var hits = ins.Search(query); 

for (int i = 0; i < hits.Length(); i++) 
    Console.WriteLine(hits.Doc(i).GetField("location").StringValue()); 

Console.WriteLine("---"); 

query = new WildcardQuery(new Term("location", "chic*")); 
hits = ins.Search(query); 

for (int i = 0; i < hits.Length(); i++) 
    Console.WriteLine(hits.Doc(i).GetField("location").StringValue()); 

iw.Close(); 
Console.ReadLine(); 
+0

감사합니다. 최신 버전을 다운로드하고 이전 시도에서 남긴 모든 디버깅 코드를 지우고 색인을 다시 작성하면 이제 와일드 카드 검색이 작동합니다! – Igorek

+0

낮은 * 또는 낮음 *을 어떻게 검색합니까? –

0

에 사용할 수있는 유일한 방법은 최신 버전을 사용 임은 검색 인덱스 문자열의 시작 부분에 구분 기호를 배치하는 것입니다 "로 시작", 그래서 "다이아몬드 반지는" "lucenedelimiter 다이아몬드처럼 색인 반지 lucenedelimiter ". 이것은 "유명한 다이아몬드 릿지 리조트 (Diamond Ridge Resort)"를 검색하는 검색이 "다이아몬드 ri *"검색에서 나타나지 않도록합니다.