Поиск по индексу Lucene.Net для поля URL - PullRequest
2 голосов
/ 13 февраля 2012

Я хочу найти в индексе Lucene.net сохраненное поле URL. Мой код указан ниже:

Field urlField = new Field("Url", url.ToLower(), Field.Store.YES,Field.Index.TOKENIZED);
document.Add(urlField);`
indexWriter.AddDocument(document);

Я использую приведенный выше код для записи в индекс.

И приведенный ниже код для поиска URL в индексе.

Lucene.Net.Store.Directory _directory = FSDirectory.GetDirectory(Host, false);
IndexReader reader = IndexReader.Open(_directory);
KeywordAnalyzer _analyzer = new KeywordAnalyzer();
IndexSearcher indexSearcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("Url", _analyzer);
Query query = parser.Parse("\"" + downloadDoc.Uri.ToString() + "\"");
TopDocs hits = indexSearcher.Search(query, null, 10);
if (hits.totalHits > 0)
{
    //statements....
}

Но всякий раз, когда я ищу URL, например: http://www.xyz.com/, я не получаю никаких обращений.

Как-то разобрался с альтернативой. Но это работает в случае только одного документа в индексе. Если документов больше, приведенный ниже код не даст правильного результата. Есть идеи? Просьба помочь

При написании индекса используйте KeywordAnalyzer ()

KeywordAnalyzer _analyzer = new KeywordAnalyzer();    
indexWriter = new IndexWriter(_directory, _analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);

Затем при поиске также используйте KeywordAnalyzer ()

IndexReader reader = IndexReader.Open(_directory);
KeywordAnalyzer _analyzer = new KeywordAnalyzer();
IndexSearcher indexSearcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("Url", _analyzer);
Query query = parser.Parse("\"" + url.ToString() + "\"");                    
TopDocs hits = indexSearcher.Search(query, null, 1);

Это потому, что KeywordAnalyzer "токенизирует" весь поток как одиночный токен.

Пожалуйста, помогите. Это срочно.

* * 1025 Приветствия Сунил ...

Ответы [ 3 ]

1 голос
/ 14 февраля 2012

Это сработало для меня:

 IndexReader reader = IndexReader.Open(_directory);                
 IndexSearcher indexSearcher = new IndexSearcher(reader);
 TermQuery tq= new TermQuery(new Term("Url", downloadDoc.Uri.ToString().ToLower()));                
 BooleanQuery bq = new BooleanQuery();
 bq.Add(tq, BooleanClause.Occur.SHOULD);
 TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);

Используйте StandardAnalyzer при записи в индекс.

Этот ответ помог мне: Поиск Lucene по URL

0 голосов
/ 13 февраля 2012

Использование пробела или анализатора ключевых слов должно работать.

Будет ли кто-нибудь на самом деле искать "http://www.Google.com"?". Скорее всего, пользователь вместо этого будет искать "Google".

Вы можетевсегда возвращайте весь URL, если они частично совпадают. Я думаю, что стандартный анализатор должен быть более подходящим для поиска и извлечения URL.

0 голосов
/ 13 февраля 2012

попробуйте поставить кавычки вокруг запроса, например.как это:

"http://www.google.com/"

...