喜欢在Elasticsearch中搜索

时间:2015-07-02 05:09:05

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

我正在使用elasticsearch来过滤和搜索json文件,我是这项技术的新手。所以我对如何在elasticsearch中编写类似查询感到有些困惑。

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

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

3 个答案:

答案 0 :(得分:23)

如果可能的话,我强烈建议更新您的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

注意: NOT 盲目地使用部分匹配,虽然有使用它的极端情况,正确使用分析仪几乎总是更好。

此精确查询也相当于LIKE '%a%',再次,可以通过正确使用映射和普通查询搜索来更好地设置!

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

如果您正在阅读这种对于按类型搜索类似地查询ES的想法,我建议您阅读edge-ngrams,这与正确使用映射有关,具体取决于您尝试做什么=)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在我写的查询下面,这就像

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*"
               }
            }
         ]
      }
   }
}