通配符查询查询中带有正斜杠的数组

时间:2019-10-11 05:01:02

标签: elasticsearch wildcard

在我的由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"
      }
    }

1 个答案:

答案 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/*"
      }
    }
  }
}`