当前位置: 首页 > 面试题库 >

如何在Lucene QueryParser中指定两个字段?

邴宏大
2023-03-14
问题内容

我阅读了[如何在QueryParser中合并多个字段?](http://codingdict.com/questions/136407但是我不明白。

目前,我有一个非常奇怪的结构,例如:

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”字段中寻找搜索词。


问题答案:

有3种方法可以做到这一点。

第一种方法是手动构造查询,这是QueryParser内部的工作。这是执行此操作最强大的方法,这意味着如果要阻止访问某些更奇特的功能,则不必解析用户输入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,允许访问其具有的所有功能,只是它将搜索多个字段。

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 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的和标题,那么你只需要搜索一个领域。



 类似资料:
  • 我正在使用log4j日志记录,并且正在尝试记录到不同的日志文件。我还希望能够在不同的日志文件中显示类名。如何实例化我的两个不同的日志文件:serverFileLog和ClientLogger。我需要传入类名,所以调用get logger,我不能使用logger名。请救命!!!!!!谢谢!! log4j.rootlogger=debug,serverFileLog log4j.appender.se

  • 问题内容: 如果我有方法 如何在不进行强制转换的情况下使用数字参数来调用它? 给出一个错误。 问题答案: 你不能。基本数字常量被认为是整数(如果后面跟有“ L”,则为整数),因此必须将其显式下转换为字节,以将其作为参数传递。据我所知,没有捷径可走。

  • 比如说,我有一个名为“Contact”的表,其中“first\u name”和“last\u name”作为列。基本上,“从联系人c中选择concat(c.firstname,,,c.lastname)作为全名”是我在hibernate中想要做的。 我可以将整个查询放在createQuery中,并获得所需的输出。但是,我不想在hibernate中执行sql查询。我在这里找到了一篇类似的帖子“我们可

  • 问题内容: 我有很多对象。 如何按名称和年龄先后按字母顺序对该数组排序? 您将使用哪种算法? 问题答案: 你可以使用以下方法: 现在按名称排序,然后按年龄排序。 “从字典上比较两个字符串”-来自docs。 是本机库中的静态方法。它会进行实际的排序,你只需要提供一个即可定义应该如何比较列表中的两个元素:这是通过提供你自己的方法实现来实现的。

  • 我有对象数组。 如何按名称和年龄按字母顺序对该数组进行排序? 你会使用哪种算法?

  • 问题内容: 因为不接受运算符,有没有一种快速比较两个字典的简便方法? 通过比较两个字典,我的意思是检查它们是否具有相同的精确键,并且对于每个键都具有相同的值。 问题答案: 正如Hot Licks所述,您可以使用NSDictionary方法isEqualToDictionary()来检查它们是否相等,如下所示: 您还可以实现自定义运算符“ ==”,如下所示: Xcode 9•Swift 4 从文档开