更改弹性搜索中连字符的解释方式



我有一个字段,其中包含具有以下结构的名称<name>-<version>(例如foo-1.0)。

我有以下分析仪配置:

"settings": {
  "index": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "snowball",
          "language": "English"
        }
      }
    }
  }

以及以下映射:

"itemName": {
  "type": "multi_field",
    "fields": {
      "itemName": {
        "type": "string",
        "index": "analyzed"
      },
      "untouched": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  },

我希望能够搜索foo-1.0而不必引用它。从用户反馈来看,这是他们期望能够做到的,但不幸的是,foo-1.0被解释为foo NOT 1.0。我知道连字符等同于NOT,但我天真地认为只有在前面加一个空格(例如foo -1.0)的情况下它才会这样做。有没有一种方法可以配置elasticsearch来停止将连字符解释为NOT,或者在没有空格前缀的情况下停止在连字符上拆分?还是我可以通过分析器影响它?

我不知道这是否会影响答案,但我也希望能够在同一查询中搜索其他字段。例如foo-1.0 OR bar之类的东西。

非常感谢您的帮助。

格雷厄姆。

您可以用反斜杠转义-(或者使用JSON双反斜杠\

搜索

"foo\-1.0"
curl -XPUT http://localhost:9200/index_name -d '{
    "mappings" : {
        "type_name" : {
            "properties" : {
                "field_name" : { "type": "string", "index" : "not_analyzed" }
            }
        }
    }
}'

之后可以使用查询或查询字符串。

最新更新