一尘不染

ElasticSearch-使用连字符搜索

elasticsearch

弹性搜寻1.6

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

数据样本(简体):

{"title":"U-12 Soccer",
 "comment": "the t-shirts are dirty"}

所以我去了这个映射:

{
  "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"
        }
      }
    }
  }
}

使用以下查询进行搜索:

{"_source":true,
  "query":{
    "simple_query_string":{
      "query":"<Text>",
      "default_operator":"AND"
    }
  }
}
  1. 什么有效:

“ U-12”,“ U ”,“ t ”,“ ts *”

  1. 什么不起作用:

“ U-”,“ u-1 ”,“ t-”,“ t-sh ”,…

看来char过滤器未在搜索字符串上执行?我该怎么做才能使这项工作?


阅读 542

收藏
2020-06-22

共1个答案

一尘不染

答案很简单:

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"
    }
  }
}
2020-06-22