Elasticsearch 高级别的客户端多字段搜索
Posted
技术标签:
【中文标题】Elasticsearch 高级别的客户端多字段搜索【英文标题】:Elasticsearch high level rest client more than 1 field search 【发布时间】:2019-07-11 19:47:29 【问题描述】:我正在使用 Scala 2.12 来查询 ElasticSearch (6.5)。
我可以使用查询构建器进行单个字段搜索,如下所示:
val searchSourceBuilder = new SearchSourceBuilder()
val qb = new BoolQueryBuilder()
.must(QueryBuilders.regexpQuery("header.fieldname", "01_.+_20190711_data"))
searchSourceBuilder.query(qb)
使用上述(我需要正则表达式搜索)我可以搜索相关文档。
但是,我有更复杂的要求,我必须匹配多个字段值对上的文档。
即
header.fieldname 应该匹配模式“01_.+data” 和 header.fieldname2 应该匹配模式 "type.+_2019-07-11"
基本上,它就像 2 个或更多列(和值字符串)上的 SQL where 子句。
我正在检查https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html
但这就像在多个字段中搜索相同的字符串(值)。这不是我想要的。 我基本上想要在 where 子句中使用 SQL AND 之类的东西(如果它也使用正则表达式会更好)。
更新:
请注意@Meet Rathod 的以下回答有效并被接受。
但是,为了向前推进,所以如果我需要另外一个条件,即 SQL OR,我下面的代码是否正确。 必填:
header.fieldname: 01_.+data AND header.fieldname2: type.+_2019-07-11 AND (header.fieldname3: some_thing OR header.fieldname3: some_other_thing)
代码:
val qb = new BoolQueryBuilder()
.must(QueryBuilders.regexpQuery("header.fieldname", "01_.+_20190711_data"))
.must(QueryBuilders.regexpQuery("header.fieldname2", "type.+_2019-07-11"))
.should(QueryBuilders.regexpQuery("header.fieldname3", "some_thing"))
.should(QueryBuilders.regexpQuery("header.fieldname3", "some_other_thing"))
这是正确的还是我遗漏了什么?
【问题讨论】:
【参考方案1】:据我了解,您只希望那些满足所有条件的文档应在结果中列出。如果是这种情况,我相信在您的查询中添加另一个 must 子句应该会得到您的预期结果。原始查询看起来像这样。
"query":
"bool":
"must": [
"regexp":
"header.fieldname": "01_.+data"
,
"regexp":
"header.fieldname2": "type.+_2019-07-11"
]
我不确定,但是你的 Scala 代码应该是这样的。
val qb = new BoolQueryBuilder()
.must(QueryBuilders.regexpQuery("header.fieldname", "01_.+_20190711_data"))
.must(QueryBuilders.regexpQuery("header.fieldname2", "type.+_2019-07-11"))
【讨论】:
非常感谢。有用。我一直在寻找为 Querybuilder 设置多个条件。以上是关于Elasticsearch 高级别的客户端多字段搜索的主要内容,如果未能解决你的问题,请参考以下文章
在 JAVA 的 elasticsearch 高级客户端中添加身份验证
ElasticsearchNEST高级客户端--Mapping映射