ElasticSearch - 使用连字符搜索

rvh*_*deg 8 mapping hyphen elasticsearch

弹性搜索1.6

我想索引包含连字符的文本,例如U-12,U-17,WU-12,T恤......并且能够使用"简单查询字符串"查询来搜索它们.

数据样本(简化):

{"title":"U-12 Soccer",
 "comment": "the t-shirts are dirty"}
Run Code Online (Sandbox Code Playgroud)

由于关于连字符的问题已经有很多,我已经尝试了以下解决方案:

使用Char过滤器:ElasticSearch - 在名称中使用连字符进行搜索.

所以我去了这个映射:

{
  "settings":{
    "analysis":{
      "char_filter":{
        "myHyphenRemoval":{
          "type":"mapping",
          "mappings":[
            "-=>"
          ]
        }
      },
      "analyzer":{
        "default":{
          "type":"custom",
          "char_filter":  [ "myHyphenRemoval" ],
          "tokenizer":"standard",
          "filter":[
            "standard",
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings":{
    "test":{
      "properties":{
        "title":{
          "type":"string"
        },
        "comment":{
          "type":"string"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

使用以下查询完成搜索:

{"_source":true,
  "query":{
    "simple_query_string":{
      "query":"<Text>",
      "default_operator":"AND"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 什么有效:

    "U-12","U*","t*","ts*"

  2. 什么行不通:

    "U-*","u-1*","t-*","t-sh*",......

所以似乎char过滤器没有在搜索字符串上执行?我能做些什么来完成这项工作?

rvh*_*deg 7

答案很简单:

引自Igor Motov:配置标准的标记器

默认情况下,simple_query_string查询不会使用通配符分析单词.因此,它会搜索以i-ma开头的所有令牌.单词i-mac与此请求不匹配,因为在分析过程中,它分为两个令牌i和mac,这些令牌都不以i-ma开头.为了使这个查询找到i-mac,你需要让它分析通配符:

{
  "_source":true,
  "query":{
    "simple_query_string":{
      "query":"u-1*",
      "analyze_wildcard":true,
      "default_operator":"AND"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)