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映射

Elasticsearch-高级搜索(拼音|首字母|简繁|二级搜索)

ElasticSearch实战(十六)-高级数据字段类型

ElasticSearch在JavaAPI中的操作(入门)

Elasticsearch7.8.0版本高级查询—— 过滤字段查询文档