【问题标题】:Regular Expressions and Elastic Search正则表达式和弹性搜索
【发布时间】:2016-04-09 00:18:58
【问题描述】:

我正在尝试使用 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
}

事实上,Elasticsearch 的 Sense UI 会立即提醒您“错误的字符串语法错误”。那是因为即使在查询中弹性搜索也希望某些字符被转义。尽管如此,^[\\S]a* 也不起作用。

【问题讨论】:

  • 尝试\b字边界而不是[\S]

标签: regex elasticsearch


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2011-12-27
    • 2013-06-14
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多