簡體   English   中英

Lucene:從索引中刪除,基於多個字段

[英]Lucene: delete from index, based on multiple fields

我需要從 lucene 搜索索引中刪除文檔。 標准方法:

indexReader.deleteDocuments(new Term("field_name", "field value"));

不會成功:我需要根據多個字段執行刪除。 我需要這樣的東西:

(pseudo code)
TermAggregator terms = new TermAggregator();
terms.add(new Term("field_name1", "field value 1"));
terms.add(new Term("field_name2", "field value 2"));
indexReader.deleteDocuments(terms.toTerm());

是否有任何構造?

IndexWriter具有允許更強大刪除的方法,例如IndexWriter.deleteDocuments(Query) 您可以使用要刪除的術語的連接來構建 BooleanQuery,然后使用它。

分析儀的選擇

首先,注意您使用的是哪種分析儀。 我被難住了一段時間才意識到 StandardAnalyzer 過濾掉了像“the”和“a”這樣的常見詞。 當您的字段具有值“A”時,這是一個問題。 您可能需要考慮 KeywordAnalyzer:

請參閱有關分析器的這篇文章。

// Create an analyzer:
// NOTE: We want the keyword analyzer so that it doesn't strip or alter any terms:
// In our example, the Standard Analyzer removes the term 'A' because it is a common English word.
// https://stackoverflow.com/a/9071806/231860
KeywordAnalyzer analyzer = new KeywordAnalyzer();

查詢解析器

接下來,您可以使用 QueryParser 創建查詢:

請參閱有關覆蓋默認運算符的這篇文章。

// Create a query parser without a default field in this example (the first argument):
QueryParser queryParser = new QueryParser("", analyzer);

// Optionally, set the default operator to be AND (we leave it the default OR):
// https://stackoverflow.com/a/9084178/231860
// queryParser.setDefaultOperator(QueryParser.Operator.AND);

// Parse the query:
Query multiTermQuery = queryParser.parse("field_name1:\"field value 1\" AND field_name2:\"field value 2\"");

查詢接口

或者您可以通過使用他們的 API 自己構建查詢來實現相同的目的:

請參閱有關創建 BooleanQuery 的教程。

BooleanQuery multiTermQuery = new BooleanQuery();
multiTermQuery.add(new TermQuery(new Term("field_name1", "field value 1")), BooleanClause.Occur.MUST);
multiTermQuery.add(new TermQuery(new Term("field_name2", "field value 2")), BooleanClause.Occur.MUST);

數字字段查詢(Int 等...)

當關鍵字段是數字時,您不能使用 TermQuery,而必須使用 NumericRangeQuery。

請參閱此問題的答案。

// NOTE: For IntFields, we need NumericRangeQueries:
// https://stackoverflow.com/a/14076439/231860
BooleanQuery multiTermQuery = new BooleanQuery();
multiTermQuery.add(NumericRangeQuery.newIntRange("field_name1", 1, 1, true, true), BooleanClause.Occur.MUST);
multiTermQuery.add(NumericRangeQuery.newIntRange("field_name2", 2, 2, true, true), BooleanClause.Occur.MUST);

刪除與查詢匹配的文檔

然后我們最終將查詢傳遞給編寫器以刪除與查詢匹配的文檔:

請參閱此問題的答案。

// Remove the document by using a multi key query:
// http://www.avajava.com/tutorials/lessons/how-do-i-combine-queries-with-a-boolean-query.html
writer.deleteDocuments(multiTermQuery);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM