elasticsearch ElasticSearch-使用连字符搜索
弹性搜索1.6 我想索引包含连字符的文本,例如U-12、U-17、WU-12、t恤。。。并且能够使用“简单查询字符串”查询来搜索它们 数据样本(简化): 由于已经有很多关于连字符的问题,我已经尝试了以下解决方案: 使用字符筛选器: 所以我选择了这个映射:elasticsearch ElasticSearch-使用连字符搜索,elasticsearch,mapping,hyphen,elasticsearch,Mapping,Hyphen,弹性搜索1.6 我想索引包含连字符的文本,例如U-12、U-17、WU-12、t恤。。。并且能够使用“简单查询字符串”查询来搜索它们 数据样本(简化): 由于已经有很多关于连字符的问题,我已经尝试了以下解决方案: 使用字符筛选器: 所以我选择了这个映射: { "settings":{ "analysis":{ "char_filter":{ "myHyphenRemoval":{ "type":"mapping",
{
"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"
}
}
}
{u source:true,
“查询”:{
“简单查询字符串”:{
“查询”:“,
“默认_运算符”:“和”
}
}
}
我该怎么做才能让这一切顺利进行呢?答案非常简单: 引自伊戈尔·莫托夫: 默认情况下,“简单查询”字符串查询不分析单词 使用通配符。因此,它会搜索以开头的所有标记 伊玛。单词i-mac与此请求不匹配,因为在 分析它被分成两个令牌i和mac,这两个令牌都不是 代币以i-ma开头。为了让这个查询找到i-mac你 需要使其分析通配符:
引自Igor Motov的话是真的,您必须添加“analyze_wildcard”:真的,以使其与正则表达式一起工作。但需要注意的是,连字符实际上在“u”“12”中表示“u-12”,这两个词是分开的 如果保留原始文件很重要,请不要使用映射字符过滤器。否则就有点有用了 假设您有“m0-77”、“m1-77”和“m2-77”,如果您搜索m*-77,您将不会有任何点击。但是,您可以使用和替换“-”(连字符)以连接两个分隔的单词,然后搜索m*和77,这将为您提供正确的命中率 你可以在客户面前这样做 在你的问题u-*
{
"query":{
"simple_query_string":{
"query":"u AND 1*",
"analyze_wildcard":true
}
}
}
t-sh*
如果有人仍在寻找解决此问题的简单方法,请在为数据编制索引时将连字符替换为下划线
\uu
例如,O-00002334的索引应为O_00002334
搜索时,在显示结果时再次将下划线替换为连字符。通过这种方式,您可以搜索“O-00002234”,它将找到正确的匹配项。如果数据中已经有下划线“\u1”,那么替换为hypen显示输出将是错误的。如果源数据有下划线,则显然不需要用连字符替换它。
{
"_source":true,
"query":{
"simple_query_string":{
"query":"u-1*",
"analyze_wildcard":true,
"default_operator":"AND"
}
}
}
{
"query":{
"simple_query_string":{
"query":"u AND 1*",
"analyze_wildcard":true
}
}
}
{
"query":{
"simple_query_string":{
"query":"t AND sh*",
"analyze_wildcard":true
}
}
}