【问题标题】:ElasticSearch - Searching with hyphensElasticSearch - 使用连字符搜索
【发布时间】:2015-09-04 04:35:27
【问题描述】:

弹性搜索 1.6

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

数据样本(简化):

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

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

使用字符过滤器:ElasticSearch - Searching with hyphens in name

所以我选择了这个映射:

{
  "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*”

  2. 什么没用:

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

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

【问题讨论】:

    标签: elasticsearch mapping hyphen


    【解决方案1】:

    如果有人仍在寻找解决此问题的简单方法,请在索引数据时将连字符替换为下划线 _

    例如,O-000022334 应索引为 O_000022334。

    搜索时,在显示结果时再次将下划线替换回连字符。这样您就可以搜索“O-000022334”,它会找到正确的匹配项。

    【讨论】:

    • 如果数据中已经有下划线“_”怎么办,而替换为hypen显示输出会出错..
    • 如果源数据有下划线,你显然不需要用连字符替换它。
    • @Jesal 他的意思是,如果两者兼而有之,应该被认为是不同的。例如,如果您的数据中有两个项目“O_000022334”和“O-000022334”,如果您搜索“O-000022334”,您只想找到项目“O-000022334”。
    【解决方案2】:

    Igor Motov 的引用是正确的,您必须添加“analyze_wildcard”:true,以使其与正则表达式一起使用。但重要的是要注意,连字符实际上将“u-12”标记为“u”“12”,两个分开的词。

    如果保留原始内容很重要,请不要使用 Mapping char 过滤器。否则有点用处。

    假设您有“m0-77”、“m1-77”和“m2-77”,如果您搜索 m*-77,您将获得零命中。但是,您可以将“-”(连字符)替换为 AND,以便连接两个分隔的单词,然后搜索 m* AND 77,这将为您提供正确的匹配。

    您可以在客户端执行此操作。

    在你的问题中 u-*

    {
      "query":{
        "simple_query_string":{
          "query":"u AND 1*",
          "analyze_wildcard":true
        }
      }
    }
    

    t-sh*

      {
          "query":{
            "simple_query_string":{
              "query":"t AND sh*",
              "analyze_wildcard":true
            }
          }
        }
    

    【讨论】:

      【解决方案3】:

      答案很简单:

      引自 Igor Motov:Configuring the standard tokenizer

      默认情况下 simple_query_string 查询不分析单词 带通配符。结果,它搜索所有以 我是一个。 i-mac 一词与此请求不匹配,因为在 分析它分为两个令牌 i 和 mac 并且这些都不是 令牌以 i-ma 开头。为了让这个查询找到 i-mac 你 需要让它分析通配符:

      {
        "_source":true,
        "query":{
          "simple_query_string":{
            "query":"u-1*",
            "analyze_wildcard":true,
            "default_operator":"AND"
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        相关资源
        最近更新 更多