我正在使用弹性搜索来搜索我的ID
。我的ID
看起来像21.11101/0000-0000-9B71-2
。但是,当我在我的ES中使用它时,它会抛出错误说:
无法解析查询[21.11101 / 0000-0000-9B71-2]“
遇到:EOF之后:\“/ 0000-0000-9B71-2 \”
我认为这是因为ES认为/0
是EOF
个字符。 如何告诉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命中。我猜是因为上面的错误。那么,我该如何解决这个问题?
感谢您的帮助。
答案 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
部分。
希望有所帮助:)