Ignite多字段TextQuery查询:指定或多字段搜索实现疑问
Ignite TextQuery 针对指定字段的文本搜索方案
首先先确认你的实体类配置没问题,@QueryTextField确实已经把brand和description标记为可被Lucene索引的文本字段了,这是后续指定字段搜索的基础:
@Data @AllArgsConstructor public class SearchItem implements Serializable { private String id; @QueryTextField private String description; @QueryTextField private String brand; }
接下来针对你需要的几种搜索场景,分别给出具体实现:
1. 仅在brand字段执行文本搜索
要指定单个字段搜索,你可以在创建TextQuery时,把字段名和搜索词用:拼接后传入,或者用setFields()方法显式指定字段:
// 获取Ignite缓存实例 IgniteCache<String, SearchItem> cache = ignite.cache("your-cache-name"); // 方式一:直接在搜索词中指定字段 TextQuery<String, SearchItem> brandQuery = new TextQuery<>(SearchItem.class, "brand:xxx"); // 方式二:用setFields指定字段 // TextQuery<String, SearchItem> brandQuery = new TextQuery<>(SearchItem.class, "xxx"); // brandQuery.setFields("brand"); // 执行查询并遍历结果 QueryCursor<Cache.Entry<String, SearchItem>> brandResults = cache.query(brandQuery); for (Cache.Entry<String, SearchItem> entry : brandResults) { System.out.println("匹配的商品:" + entry.getValue()); }
2. 仅在description字段执行文本搜索
逻辑和上面完全一致,只需要把目标字段换成description即可:
// 直接指定字段的写法 TextQuery<String, SearchItem> descQuery = new TextQuery<>(SearchItem.class, "description:xxx"); // 或者用setFields的写法 // TextQuery<String, SearchItem> descQuery = new TextQuery<>(SearchItem.class, "xxx"); // descQuery.setFields("description"); QueryCursor<Cache.Entry<String, SearchItem>> descResults = cache.query(descQuery); // 遍历结果逻辑同上
3. 同时在brand和description字段执行文本搜索
如果要让搜索词在两个字段中匹配,有两种常用方式:
- OR逻辑(任意字段匹配即可):可以在搜索词中同时指定两个字段,或者用
setFields传入多个字段名:
// 方式一:搜索词中指定多个字段 TextQuery<String, SearchItem> multiFieldOrQuery = new TextQuery<>(SearchItem.class, "brand:xxx description:xxx"); // 方式二:用setFields指定多个字段 // TextQuery<String, SearchItem> multiFieldOrQuery = new TextQuery<>(SearchItem.class, "xxx"); // multiFieldOrQuery.setFields("brand", "description");
- AND逻辑(两个字段都需匹配):借助Lucene的查询语法,用
+标记必须匹配的条件:
// 要求brand包含"xxx" 且 description包含"yyy" TextQuery<String, SearchItem> multiFieldAndQuery = new TextQuery<>(SearchItem.class, "+brand:xxx +description:yyy");
补充说明:Ignite的TextQuery底层基于Lucene,所以支持大部分Lucene原生查询语法,比如通配符*、模糊搜索~等,有复杂需求时可以参考Lucene的查询规则来构造搜索词。
内容的提问来源于stack exchange,提问作者Mulgard
相关产品推荐
相关产品推荐

