正则表达式和弹性搜索

时间:2016-04-09 00:18:58

标签: regex elasticsearch

我正在尝试使用elasticsearch检索一些公司结果。我想让那些以" A"然后" B"等开头的公司。如果我只是用"前缀"做一个非常典型的查询。像这样

GET apple/company/_search
{
  "query": {
    "prefix": {
      "name": "a"
    }
  },
  "fields": [
    "id",
    "name",
    "websiteUrl"
  ],
  "size": 100
}

但这会让Acme和Lemur and Associates一起回归,所以我需要在整个名字的开头区分A,而在一个单词的开头只区分A.

似乎正常的表达式会在这里得到拯救,但弹性搜索只会忽略我尝试的任何东西。在使用其他应用程序进行的测试中,^[\S]a*应该会为您提供以A开头并且前面没有空格的任何内容。弹性搜索返回0结果,其中包含以下内容:

GET apple/company/_search
{
  "query": {
    "regexp": {
      "name": "^[\S]a*"
    }
  },
  "fields": [
    "id",
    "name",
    "websiteUrl"
  ],
  "size": 100
}

在FACT中,Elasticsearch的Sense UI会立即提醒您注意错误的字符串语法错误"。这是因为即使在查询中,弹性搜索也希望某些字符被转义。尽管如此,^[\\S]a*也无法正常工作。

1 个答案:

答案 0 :(得分:2)

在Elasticsearch中搜索 关于查询本身,还有关于数据建模的信息,因此它最适合使用的查询。人们不能简单地索引任何东西,然后努力想出一个能做某事的查询。

您的查询的Elasticsearch方法是为该字段提供以下映射:

PUT /apple
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "keyword_lowercase": {
            "type": "custom",
            "tokenizer": "keyword",
            "filter": [
              "lowercase"
            ]
          }
        }
      }
    }
  },
  "mappings": {
    "company": {
      "properties": {
        "name": {
          "type": "string",
          "fields": {
            "analyzed_lowercase": {
              "type": "string",
              "analyzer": "keyword_lowercase"
            }
          }
        }
      }
    }
  }
}

并使用此查询

GET /apple/company/_search
{
  "query": {
    "prefix": {
      "name.analyzed_lowercase": {
        "value": "a"
      }
    }
  }
}

GET /apple/company/_search
{
  "query": {
    "query_string": {
      "query": "name.analyzed_lowercase:A*"
    }
  }
}