我有一个包含 2 个内容字段(分析、索引和存储)的索引:
例如:name
, hobbies
. (爱好字段可以多次添加不同的值)。
我有另一个仅被索引的字段(未分析且未存储)用于过滤:
例如:country_code
现在,我想构建一个查询,该查询将检索与某些“搜索”输入字段匹配(尽可能)的文档,但只有这样的文档country_code
具有某些确切值。
用于构建此类查询的最合适的组合查询语法/查询解析器是什么。
我有一个包含 2 个内容字段(分析、索引和存储)的索引:
例如:name
, hobbies
. (爱好字段可以多次添加不同的值)。
我有另一个仅被索引的字段(未分析且未存储)用于过滤:
例如:country_code
现在,我想构建一个查询,该查询将检索与某些“搜索”输入字段匹配(尽可能)的文档,但只有这样的文档country_code
具有某些确切值。
用于构建此类查询的最合适的组合查询语法/查询解析器是什么。
为什么不从 开始QueryParser
,它可能适用于您的用例,并且需要最少的工作量。
您的问题尚不清楚,但我们假设您有一个输入字段(“搜索”)和一个国家代码组合框。然后,您将读取这些值并创建一个查询:
// you don't have to use two parsers, you can do this using one.
QueryParser nameParser = new QueryParser(Version.LUCENE_CURRENT, "name", your_analyzer);
QueryParser hobbiesParser = new QueryParser(Version.LUCENE_CURRENT, "hobbies", your_analyzer);
BooleanQuery q = new BooleanQuery();
q.add(nameParser.parser(query), BooleanClause.Occur.SHOULD);
q.add(hobbiesParser.parser(query), BooleanClause.Occur.SHOULD);BooleanClause.Occur.SHOULD);
/* Filtering by country code can be done using a BooleanQuery
* or a filter, the difference will be how Lucene scores matches.
* For example, using a filter:
*/
Filter countryCodeFilter = new QueryWrapperFilter(new TermQuery(new Term("country_code", )));
//and finally searching:
TopDocs topDocs = searcher.search(q, countryCodeFilter, 10);
您可以使用以下查询:
country_code:india +(name:search_value OR hobbies:search_value)