How to specify two Fields in Lucene QueryParser?(如何在 Lucene QueryParser 中指定两个字段?)
问题描述
我阅读了 如何在 QueryParser 中合并多个字段? 但我没听懂.
I read How to incorporate multiple fields in QueryParser? but i didn't get it.
目前我有一个非常奇怪的结构,例如:
At the moment i have a very strange construction like:
parser = New QueryParser("bodytext", analyzer)
parser2 = New QueryParser("title", analyzer)
query = parser.Parse(strSuchbegriff)
query2 = parser.Parse(strSuchbegriff)
我能做些什么:
parser = New QuerParser ("bodytext" , "title",analyzer)
query =parser.Parse(strSuchbegriff)
因此解析器会在bodytext"字段和title"字段中查找搜索词.
so the Parser looks for the searching word in the field "bodytext" an in the field "title".
推荐答案
有 3 种方法可以做到这一点.
There are 3 ways to do this.
第一种方式是手动构造查询,这就是QueryParser
在内部做的.这是最有效的方法,这意味着如果您想阻止访问 QueryParser
的一些更奇特的功能,则不必解析用户输入:
The first way is to construct a query manually, this is what QueryParser
is doing internally. This is the most powerful way to do it, and means that you don't have to parse the user input if you want to prevent access to some of the more exotic features of QueryParser
:
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("bodytext", "<text>"));
Query query2 = new TermQuery(new Term("title", "<text>"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
// Use BooleanClause.Occur.MUST instead of BooleanClause.Occur.SHOULD
// for AND queries
Hits hits = searcher.Search(booleanQuery);
第二种方法是使用MultiFieldQueryParser
,它的行为类似于QueryParser
,允许访问它拥有的所有功能,除了它会搜索多个字段.
The second way is to use MultiFieldQueryParser
, this behaves like QueryParser
, allowing access to all the power that it has, except that it will search over multiple fields.
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
new string[] {"bodytext", "title"},
analyzer);
Hits hits = searcher.Search(queryParser.parse("<text>"));
最后一种方式是使用QueryParser
的特殊语法看这里.
The final way is to use the special syntax of QueryParser
see here.
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
QueryParser queryParser = new QueryParser("<default field>", analyzer);
// <default field> is the field that QueryParser will search if you don't
// prefix it with a field.
string special = "bodytext:" + text + " OR title:" + text;
Hits hits = searcher.Search(queryParser.parse(special));
您的另一种选择是在索引内容时创建一个名为 bodytextandtitle 的新字段,您可以将 bodytext 和标题的内容放入其中,然后您只需搜索一个字段.
Your other option is to create new field when you index your content called bodytextandtitle, into which you can place the contents of both bodytext and title, then you only have to search one field.
这篇关于如何在 Lucene QueryParser 中指定两个字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何在 Lucene QueryParser 中指定两个字段?


基础教程推荐
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- 降序排序:Java Map 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01