Lucene поиск по URL - PullRequest
       25

Lucene поиск по URL

3 голосов
/ 16 марта 2011

Я храню документ с полем URL:

Document doc = new Document();
doc.add(new Field("url", url, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("text", text, Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("html", CompressionTools.compressString(html), Field.Store.YES));

Я бы хотел найти документ по его URL, но я получаю 0 результатов:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30)
Query query = new QueryParser(LUCENE_VERSION, "url", analyzer).parse(url);
IndexSearcher searcher = new IndexSearcher(index, true);
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
searcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
// Display results
for (ScoreDoc hit : hits) {
  System.out.println("FOUND A MATCH");
}
searcher.close();

Что я могу сделать по-другому, чтобы я мог сохранить документ HTML и найти его по URL?

Ответы [ 2 ]

4 голосов
/ 16 марта 2011

Вы можете переписать ваш запрос примерно так:

Query query = new QueryParser(LUCENE_VERSION, "url", analyzer).newTermQuery(new Term("url", url)).parse(url);

Предложение:

Я предлагаю вам использовать BooleanQuery, поскольку он дает хорошую производительность и внутренне оптимизирован.

TermQuery tq= new TermQuery(new Term("url", url));
// BooleanClauses Enum SHOULD says Use this operator for clauses that should appear in the matching documents.
BooleanQuery bq = new BooleanQuery().add(tq,BooleanClause.Occur.SHOULD);
IndexSearcher searcher = new IndexSearcher(index, true);
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
searcher.search(query, collector);

Я вижу, вы индексируете, используя URL-адрес frield как Not_Analysed, что является хорошим IMO для поиска, так как анализатор не используется, значение будет сохранено как один термин.

Теперьесли в вашем экономическом обосновании указано, что я дам вам URL-адрес, который найдет EXACT из индекса Lucene Index, то вы посмотрите на индексирование с помощью другого анализатора (KeywordAnalyzer и т. д.)

2 голосов
/ 16 марта 2011

Lucene QueryParser интерпретирует некоторые из символов url как часть синтаксиса Query Parser .Вместо этого вы можете использовать TermQuery, например:

TermQuery query = new TermQuery(new Term("url", url));
...