无法使用包含“/ 0”的字符串搜索弹性搜索

时间:2017-03-20 21:54:40

标签: elasticsearch

我正在使用弹性搜索来搜索我的ID。我的ID看起来像21.11101/0000-0000-9B71-2。但是,当我在我的ES中使用它时,它会抛出错误说:

  

无法解析查询[21.11101 / 0000-0000-9B71-2]“

     

遇到:EOF之后:\“/ 0000-0000-9B71-2 \”

我认为这是因为ES认为/0EOF个字符。 如何告诉ES将我的搜索查询视为普通文本?以下是我的查询:

GET _search
{
  "query": {
        "query_string": {
           "query": "21.11101/0000-0000-9B71-2"
        }
    }
}

这是我的_mapping

"PID": {
    "type": "text",
    "fields": {
        "keyword": {
            "type": "keyword",
            "ignore_above": 256
        }
    }
}

我想使用前缀查询,所以基本上,我的查询将如下所示:

GET _search
{
  "query": {
    "prefix": {
      "ID" : "21.11101/00"
    }
  }
}

但该查询返回0命中。我猜是因为上面的错误。那么,我该如何解决这个问题?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

让我们分解一下:你的映射说的是:

  • "PID": { "type": "text", ...表示PID字段的内容将是带有默认分析器的文本,standard。它会通过空格和一些单词分隔符来标记输入文本,例如-(连字符),/(正斜杠)和其他一些。
  • ... "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } }会提示ES将PID字段的其他版本保留为关键字,可以通过别名PID.keyword访问该关键字。 multi-fields的重要限制是您无法对其进行搜索。您只能进行排序和聚合。

考虑到这一点,我的建议就像指定非标准分析器一样简单,该分析器不会对输入文本进行标记(它是keyword分析器):

curl -XPUT http://localhost:9200/my_pids -d '
{
  "mappings": {
    "pid": {
      "properties": {
        "PID": {
          "type": "text",
          "analyzer": "keyword",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}'

如果您未在PID.keyword字段中使用排序/聚合,请随时删除fields部分。

希望有所帮助:)