如何在Liferay Java代码中用StringQuery查询ElasticSearch多字段
在Liferay Java代码中实现Elasticsearch Query String指定字段查询
你已经有能直接对接Liferay Elasticsearch的JSON查询语句,现在要在Java代码里实现相同逻辑——用query_string查询name和age字段,同时匹配recordSetId为123的记录。
正确代码实现
你之前误用了StringQuery类,Liferay搜索API中对应query_string查询的是QueryStringQuery,它自带setFields方法可以指定查询字段。完整实现代码如下:
import com.liferay.portal.search.query.BoolQuery; import com.liferay.portal.search.query.MatchQuery; import com.liferay.portal.search.query.Query; import com.liferay.portal.search.query.QueryStringQuery; import com.liferay.portal.search.query.Queries; import org.osgi.service.component.annotations.Reference; // 在你的业务组件类中注入Queries实例 @Reference private Queries queries; // 构建对应JSON逻辑的查询对象 public Query buildTargetQuery() { // 构建recordSetId的精确匹配查询 MatchQuery recordSetMatchQuery = queries.match("recordSetId", "123"); // 构建query_string查询,指定搜索词和目标字段 QueryStringQuery queryStringQuery = queries.queryString("Maximil*"); queryStringQuery.setFields("name", "age"); // 这里就是你要的指定字段方法 // 组合成bool查询,对应JSON中的must逻辑 BoolQuery boolQuery = queries.bool(); boolQuery.addMustQueryClauses(recordSetMatchQuery, queryStringQuery); return boolQuery; }
执行查询(可选)
如果需要执行这个查询并获取结果,可以结合Searcher和SearchContext:
import com.liferay.portal.search.SearchContext; import com.liferay.portal.search.SearchException; import com.liferay.portal.search.SearchResult; import com.liferay.portal.search.Searcher; @Reference private Searcher searcher; public void runQuery(SearchContext searchContext) throws SearchException { Query targetQuery = buildTargetQuery(); searchContext.setQuery(targetQuery); SearchResult result = searcher.search(searchContext); // 这里处理查询返回的结果,比如获取命中的文档等 }
说明
这个代码逻辑和你提供的JSON查询完全一致:
- 两个查询都被放入bool查询的
must子句,必须同时匹配 - query_string查询明确指定了
name和age字段,支持通配符搜索
内容的提问来源于stack exchange,提问作者Michelle
相关产品推荐
相关产品推荐

