2009-07-06 17 views
10

Obecnie próbuję używać Lucene do wyszukiwania danych wypełnianych w indeksie.Lucene - Symbole wieloznaczne w wyrażeniach

Potrafię dopasować dokładnie frazy, ujmując je w nawiasy (np. "Przetwarzanie dokumentów"), ale nie mogę pozwolić, aby Lucene znalazła to zdanie, wykonując dowolny "Dokument Przetwarzający *".

Oczywistą różnicą jest symbol wieloznaczny na końcu.

Obecnie próbuję użyć Łukasza, aby wyświetlić i przeszukać indeks. (Spada gwiazdkę na końcu wyrażenia podczas analizowania)

Dodawanie cudzysłowie dane wydaje się być głównym winowajcą w poszukiwaniu dokumentu * będzie działać, ale „dokument *” nie

Any Pomoc byłaby bardzo mile widziana

+0

Fiddling z tym. Możliwe obejście. Czy istnieje sposób na wyszukiwanie zbliżeniowe za pomocą symboli wieloznacznych? Wygląda na to, że może to jednak spowodować duży spadek wydajności. –

Odpowiedz

0

QueryParser nie tylko obsługuje symbole wieloznaczne w wyrażeniach, ale sam PhraseQuery obsługuje tylko warunki. MultiPhraseQuery jest bliżej, ale zgodnie z jego podsumowaniem wciąż trzeba wyliczyć indeks IndexReader.terms, aby pasował do symbolu wieloznacznego.

0

Wygląda na to, że domyślny QueryParser nie może tego obsłużyć. Prawdopodobnie możesz utworzyć niestandardowy QueryParser dla symboli wieloznacznych w wyrażeniach. Jeśli Twój przykład jest reprezentatywny, stemming może rozwiązać Twój problem. Przeczytaj dokumentację dla PorterStemFilter, aby sprawdzić, czy pasuje.

0

Inną alternatywą jest użycie NGrams, a szczególnie EdgeNGram. http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory

Spowoduje to utworzenie indeksów dla ngrams lub części słów. dokumentów a Minimum Ngram 5 i maksymalny rozmiar Ngram 8, wskaźnik będzie: Docum Docume Dokument Dokumenty

Istnieje nieco kompromis dla rozmiaru indeksu i czasu. Jeden z książek Solr cytuje jako przybliżony przewodnik: Indeksowanie trwa 10 razy dłużej Wykorzystuje 5 razy więcej miejsca na dysku Tworzy 6 razy bardziej wyraziste hasła.

Jednak EdgeNGram zrobi to lepiej.

Musisz upewnić się, że nie przesyłasz znaków wieloznacznych w zapytaniach. Ponieważ nie wykonujesz wyszukiwania z użyciem symboli wieloznacznych, dopasowujesz wyszukiwane hasło do ngramów (części słów).

0

Szukałem tego samego i znalazłem to, że PrefixQuery daje kombinację czegoś takiego jak ten "Dokument Przetwarzania *". Ale to właśnie twoja dziedzina, której szukasz, powinna być niepoświadczona i przechowywać ją w małe litery (powód, dla którego jest to indeksowanie niesankcjonowane, nie zapisuj wartości pól małymi literami), aby to działało.Oto kod dla PrefixQuery który pracował dla mnie: -

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); 
Powiązane problemy