ElasticSearch:如何在字段中搜索%like%值

时间:2015-05-07 18:32:05

标签: elasticsearch

我有一个搜索查询(在Postman / Chrome中),它返回公司列表,但我需要根据特定模式过滤掉它们。我使用什么过滤器以及如何操作? 我需要过滤company_id LIKE%50%

的查询结果

她就是我的经历:

    {
  "fields": [
    "company_id" 
    ],
  "query": {
    "bool": {
      "must": [
                {"term": {"app.raw": "AAA"}},
                {"wildcard": {"cat.raw": "RS"}}
            ],
      "must_not": [],
      "should": []
    }          
  },
  "from": 0,
  "size": 5,
  "sort": [],
  "facets": {}
}

我得到了类似的东西:

"hits": [
            {
...
                "fields": {
                    "company_id": [
                        "745"
                    ]
                }
            },
            {
...
                "fields": {
                    "company_id": [
                        "5056"
                    ]
                }
            },
            {
...
                "fields": {
                    "company_id": [
                        "7765"
                    ]
                }
            },
            {
...
                "fields": {
                    "company_id": [
                        "5044"
                    ]
                }
            },
            {
...
                "fields": {
                    "company_id": [
                        "501"
                    ]
                }

1 个答案:

答案 0 :(得分:0)

首先,我不完全确定您面临的问题。您没有得到正确/预期的结果?您需要包含已使用的映射,因为查询将取决于它。

通配符搜索很重。如果您想进行部分匹配搜索(相当于%like%)您可以在分析器中使用ngram token filter并进行术语搜索。它将负责匹配部分字符串。

您可以定义像

这样的分析器
{
  "settings":{
    "analysis":{
      "analyzer":{
        "Like":{
          "type":"custom",
          "tokenizer":"keyword",
          "filter":[ "lowercase", "ngram" ] 
        }
      },
      "filter":{
        "ngram":{
          "type":"ngram",
          "min_gram":2,
          "max_gram":15
        }
      }
    }
  }
}

在cat.raw的映射中定义上面定义的分析器“Like”。

如果您在分析器中使用了ngram,那么您可以将查询部分更改为简单的术语查询,如

 "query": {
    "bool": {
      "must": [
                {"term": {"app.raw": "AAA"}},
                {"term": {"cat.raw": "RS"}}
            ],
      "must_not": [],
      "should": []
    }          
  }

编辑:根据评论更新答案

好了,现在很清楚你想做什么。

一种方法是在地图中定义company_id字符串并使用prefix query

"query": {
    "bool": {
      "must": [
                {"term": {"app.raw": "AAA"}},
                {"term": {"cat.raw": "RS"}},
                {"prefix":{"company_id": "50"}}
            ],
      "must_not": [],
      "should": []
    }          
  }

另一种选择可能是在分析器中为company_id使用edgengram并使用术语过滤/查询。

注意:对于“cat.raw”中的搜索,最好使用带有ngram而不是通配符查询的分析器这一术语查询。