像在Elasticsearch中搜索

26

我正在使用elasticsearch从JSON文件中进行过滤和搜索,但我是这项技术的新手。因此,我有点困惑如何在elasticsearch中编写类似的查询。

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

这是MySQL查询。我该如何在Elasticsearch中编写此查询?我使用的是Elasticsearch版本0.90.7。


0.90.7是ES的非常(非常)老版本。我建议使用最新版本。 - Andrei Stefan
1
另外,请阅读文档!它涵盖了许多使用案例,并提供了各种解决方案来满足您的需求。 - Andrei Stefan
你可以使用 regexp。 这对我很有效。 - Ali Moshiri
4个回答

51

如可能,我强烈建议更新您的ElasticSearch版本,因为自0.9.x以来已经有了重大变化。

这个问题不够具体,因为ElasticSearch可以通过许多方式实现此功能,而它们在整体目标上略有不同。如果您想要精确复制该SQL查询,则在这种情况下使用通配符查询或前缀查询。

使用通配符查询

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

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

或者前缀查询

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

或者部分匹配

注意:不要盲目使用部分匹配,虽然有它使用的边缘案例,但正确使用分析器几乎总是更好的选择。

此外,这个确切的查询将等同于LIKE '%a%',同样地,通过正确使用映射和普通查询搜索进行设置可能会更好!

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

如果你正在阅读这篇文章,想了解如何在搜索时进行类似 search-as-you-type 的查询,我建议你阅读关于 edge-ngrams 的内容,这与正确使用映射相关,取决于你尝试做什么 =)


作为 Kibana 中的 KQL,您可以尝试使用 message : "Unable to query openstack for*" and message : "*retry" 来获取 Unable to query openstack for*retry - xiaojueguan

4
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")));

给出了“and filter”的示例,以便您可以添加额外的过滤器(如果需要)。更多详细信息请参见此处:

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


2
我写了以下查询语句,这类似于:
SELECT * FROM TABLE WHERE api='payment' AND api_v='v1' AND status='200' AND response LIKE '%expired%' AND response LIKE '%token%'

请注意这里的table = document表示文档对象。
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*"
               }
            }
         ]
      }
   }
}

这个 ELK 搜索查询对于大量数据集来说需要很长时间。具有讽刺意味的是,SQL 比这些 NoSQL 查询要快得多! - Yahya

0

编写自定义的布尔查询对我很有帮助

@Query("{\"bool\":{\"should\":[{\"query_string\":{\"fields\":[\"field_name\"],\"query\":\"?0*\"}}]}}")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接