elasticsearch ElasticSearch-使用连字符搜索,elasticsearch,mapping,hyphen,elasticsearch,Mapping,Hyphen" /> elasticsearch ElasticSearch-使用连字符搜索,elasticsearch,mapping,hyphen,elasticsearch,Mapping,Hyphen" />

elasticsearch ElasticSearch-使用连字符搜索

elasticsearch ElasticSearch-使用连字符搜索,elasticsearch,mapping,hyphen,elasticsearch,Mapping,Hyphen,弹性搜索1.6 我想索引包含连字符的文本,例如U-12、U-17、WU-12、t恤。。。并且能够使用“简单查询字符串”查询来搜索它们 数据样本(简化): 由于已经有很多关于连字符的问题,我已经尝试了以下解决方案: 使用字符筛选器: 所以我选择了这个映射: { "settings":{ "analysis":{ "char_filter":{ "myHyphenRemoval":{ "type":"mapping",

弹性搜索1.6

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

数据样本(简化):

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

使用字符筛选器:

所以我选择了这个映射:

{
  "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,
“查询”:{
“简单查询字符串”:{
“查询”:“,
“默认_运算符”:“和”
}
}
}
  • 工作原理:

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

  • 什么不起作用:

    “U-*”、“U-1*”、“t-*”、“t-sh*”、

  • 那么,字符过滤器似乎没有在搜索字符串上执行?
    我该怎么做才能让这一切顺利进行呢?

    答案非常简单:

    引自伊戈尔·莫托夫:

    默认情况下,“简单查询”字符串查询不分析单词 使用通配符。因此,它会搜索以开头的所有标记 伊玛。单词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
            }
          }
        }