在我的由Elasticsearch索引的文档中,我有一个名为IPC8s.IPC8
的字段,它是一个字符串数组,看起来像这样:
["B63H011/00"]
["B60F3", "B60K1", "B60K17", "B60K17/23", "B60K6", "B60K6"]
["G06F017/00"]
etc...
(对于好奇的人,这是CPC专利分类号)
我需要用尾随通配符查询此字段。换句话说,如果我输入“ B63H”,则包含“ B63H011 / 00”的文档应该匹配。同样,如果我输入“ B63H011 /”或“ B63H011 / 0”。
我尝试了多个查询,但没有一个有效:
{
query_string: {
default_field: "IPC8s.IPC8",
query: "(B63H*) OR (B63H011/*)",
analyze_wildcard: true
}
}
我也用\"B63H*\" OR \"B63H011/*\"
尝试过一次,但是没用。
然后我尝试了:
[{
wildcard: {
"IPC8s.IPC8": { value: "B63H*" }
}
},
{
wildcard: {
"IPC8s.IPC8": { value: "B63H011/*" }
}
}]
这也不起作用。然后,我尝试转义“ /”,因为必须按字面意义使用它。没用。
我做错了什么?谢谢。
编辑:这是该特定字段的映射:
"IPC8s": {
"properties": {
"IPC8": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
这是我最新的尝试,仍然没有用(如果我不逃脱正斜线,elasticsearch将返回错误):
{
query_string: {
default_field: "IPC8s.IPC8",
query: "(B63H*) OR (B63H011\\/*)",
analyze_wildcard: true,
analyzer: "keyword"
}
}
编辑2 :这似乎可以解决问题:
{
query_string: {
default_field: "IPC8s.IPC8.keyword",
query: "(B63H*) OR (B63H011\\/*)",
analyze_wildcard: true,
analyzer: "keyword"
}
}
答案 0 :(得分:1)
带有标准分析器的文本类型将创建以下令牌,因此您无法在/
上进行搜索{
"tokens" : [
{
"token" : "b63h011",
"start_offset" : 0,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "00",
"start_offset" : 8,
"end_offset" : 10,
"type" : "<NUM>",
"position" : 1
}
]
}
使用type关键字为IPC8创建一个子字段,该子字段将按原样存储文本
GET index21/_search
{
"query": {
"wildcard": {
"IPC8s.IPC8.keyword": {
"value": "B63H011/*"
}
}
}
}`