Home Articles

如何处理ElasticSearch字段中的标点符号

Asked
Viewed 170 times
3

我在Elastic Search中存储了一个文档中的字段,我希望将其作为全文字段进行分析 . 在一种情况下,它包含 name 字段的值,如下所示:

A&B Corp

我希望能够使用这样的查询在文档中搜索自动完成窗口小部件(假设用户在自动填充字段中键入 A&B ) . 目的是将包含任何术语的文档与键入的前缀进行匹配 .

{   "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "A&B*",
          "fields": [
            "firstName",
            "lastName",
            "name",
            "key",
            "email"
          ]
        }
      },
      "filter": {
        "terms": {
          "environmentId": [
            "foo"
          ]
        }
      }
    }
  }
}

我对name字段的映射如下所示:

```java
"name": {
    "type": "string"
},

但是,我没有结果 . 查询结构适用于字段中没有 & 的文档,所以我很确定这是问题的一部分 .

但是,我不确定如何处理这个问题 . 我很确定我仍然想分析该字段进行全文搜索 .

另外,如果我在查询中的 * 之前添加一个空格(即 "query": "A&B *", ),那么我得到的结果包括 A&B ,所以我不认为它只是丢弃&符号并将 AB 视为单独的术语 .

我应该改变我的映射吗?查询?

1 Answer

  • 2

    Query_string查询具有一组需要转义的保留字符 .

    query_string : Read the reserved characters section

    所以要搜索

    'A&B'(或)'A&B Corp'(或)'A&B ....'您的查询必须是“A&B \ ”,以便query_string解析器将其视为通配符运算符 .

    • 当前您的查询正在搜索 "A&B"* 的完全匹配时,它希望asterik成为您数据的一部分 .

    • 当你搜索 "A&B " 时,空格是一个保留字符,所以它现在正在搜索"A&B"(或)"",因此在这种情况下你得到一个匹配 .

Related