繁体   English   中英

Lucene:具有多个字段的查询和文档

[英]Lucene: queries and docs with multiple fields

我有一个包含多个字段的文档集合,我需要使用来自多个字段的多个术语来执行查询。

您建议我使用什么? MultiFieldQueryParser还是MultiPhraseQuery?

谢谢

分析仪选择

首先,请注意您正在使用哪个分析仪。 我被困了一段时间才意识到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

或者,您可以通过使用其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);

删除与查询匹配的文档

然后,我们最终将查询传递给编写者,以删除与查询匹配的文档:

在这里查看我的答案,与此答案相关。

请参阅此问题的答案。

// 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