【问题标题】:Like search in Elasticsearch喜欢 Elasticsearch 中的搜索
【发布时间】:2015-09-19 11:26:48
【问题描述】:

我正在使用 elasticsearch 过滤和搜索 json 文件,我是这项技术的新手。所以我有点困惑如何在elasticsearch中编写like query。

select * from table_name where 'field_name' like 'a%'

这是 mysql 查询。如何在 Elasticsearch 中编写此查询?我使用的是弹性搜索 0.90.7 版。

【问题讨论】:

  • 0.90.7 是一个非常(非常)旧的 ES 版本。我建议使用最新版本。
  • 另外,请阅读documentation!它涵盖了许多用例,并根据您的需要提供了各种解决方案。
  • 您可以使用regexp。它对我有用。

标签: java php elasticsearch elasticsearch-plugin elasticsearch-net


【解决方案1】:

如果可能,我强烈建议您更新您的 ElasticSearch 版本,自 0.9.x 以来发生了重大变化。

这个问题不够具体,因为 ElasticSearch 可以通过多种方式实现此功能,并且它们在您的总体目标上略有不同。如果您希望准确地复制该 SQL 查询,那么在这种情况下使用通配符查询或前缀查询。

使用wildcard 查询:

注意:通配符搜索要小心,它们很慢。避免在字符串的开头使用通配符。

GET /my_index/table_name/_search
{
    "query": {
        "wildcard": {
            "field_name": "a*"
        }
    }
}

Prefix query

GET /my_index/table_name/_search
{
    "query": {
        "prefix": {
            "field_name": "a"
        }
    }
}

partial matching:

注意:不要不要盲目地使用部分匹配,虽然它的使用存在一些极端情况,但正确使用分析器几乎总是更好。

这个确切的查询也将等同于LIKE '%a%',同样,如果正确使用映射和正常的查询搜索,可以更好地设置它!

GET /my_index/table_name/_search
{
    "query": {
        "match_phrase": {
            "field_name": "a"
        }
    }
}

如果您正在阅读这篇关于以类似方式查询 ES 以进行搜索时的疑问,我建议您阅读 edge-ngrams,这与正确使用映射有关,具体取决于您尝试执行的操作 =)

【讨论】:

  • 作为 kibana 中的 kql,您可以尝试 message : "Unable to query openstack for*" and message : "*retry" 获取 Unable to query openstack for*retry
【解决方案2】:
GET /indexName/table_name/_search
{
    "query": {
        "match_phrase": {
            "field_name": "your partial text"
        }
    }
}

您可以使用"type" : "phrase_prefix" 为您的搜索添加前缀或后缀 相同的 Java 代码:

AndFilterBuilder andFilterBuilder = FilterBuilders.andFilter();
 andFilterBuilder.add(FilterBuilders.queryFilter(QueryBuilders.matchPhraseQuery("field_name",
          "your partial text")));

提供了“和过滤器”示例,以便您可以根据需要附加额外的过滤器。 检查此以获取更多详细信息:

https://www.elastic.co/guide/en/elasticsearch/guide/current/slop.html

【讨论】:

    【解决方案3】:

    下面的查询我写的,这有点像

    SELECT * FROM TABLE WHERE api='payment' AND api_v='v1' AND status='200' AND response LIKE '%expired%' AND response LIKE '%token%'
    

    请注意此处的表格 = 文档

    GET/POST 都接受

    GET /transactions-d-2021.06.24/_search
    {
       "query":{
          "bool":{
             "must":[
                {
                   "match":{
                      "api":"payment"
                   }
                },
                {
                   "match":{
                      "api_v":"v1"
                   }
                },
                {
                   "match":{
                      "status":"200"
                   }
                },
                {
                   "wildcard":{
                      "response":"*expired*"
                   }
                },
                {
                   "wildcard":{
                      "response":"*token*"
                   }
                }
             ]
          }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 2017-10-25
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      相关资源
      最近更新 更多