【问题标题】:Match string with minus character in elasticsearch在elasticsearch中匹配带有减号字符的字符串
【发布时间】:2019-09-24 03:51:34
【问题描述】:

所以在 DB 我有这个条目:

Mark-Whalberg

用词搜索时

Mark-Whalberg

我不匹配。

为什么?减号是我理解的特殊字符吗?象征着“排斥”?

查询是这样的:

{"query_string": {"query": 'Mark-Whalberg', "default_operator": "AND"}}

搜索其他所有内容,例如:

Mark
Whalberg
hlb
Mark Whalberg

返回一个匹配项。

这是存储为两个不同的部分吗?在搜索词中包含减号时如何获得匹配?

-------------编辑--------------

这是当前查询:

var fields = [
    "field1",
    "field2",
];

{"query_string":{"query": '*Mark-Whalberg*',"default_operator": "AND","fields": fields}};

【问题讨论】:

  • 如果这是 ES 5 并且您使用的是默认映射,只需在 .keyword 子字段上尝试 term 查询:"term": {"field_name.keyword": "Mark-Whalberg"}
  • 否则您需要一个.keyword 子字段:-) 来保留破折号和大小写文本。
  • 你的意思是这样的:{"query_string": {"query": 'Mark-Whalberg', "default_operator": "AND","term": {"field_name.keyword": " Mark-Whalberg"}}} 我在查询中遇到错误。我需要保留 query_string,因为有不同的搜索方式。
  • 几个字段是什么意思?您需要在问题中更加明确。如果没有提供一些信息(您的索引映射、示例数据、所需的输出),很难为您提供帮助。
  • 好吧,你错过了映射;-),但没关系。我看到@Mickaël-B 正在简短地解释分析器的故事如何在 ES 中进行。

标签: elasticsearch


【解决方案1】:

您遇到了分析器配置问题。

让我解释一下。当您在 ElasticSearch 中定义索引时,您没有为该字段指定任何分析器。这意味着它将应用Standard Analyzer

根据documentation

标准分析器

标准分析器是默认分析器,如果没有则使用 指定的。它提供基于语法的标记化(基于 Unicode 文本分割算法,在 Unicode 标准中指定 附件 #29)并且适用于大多数语言。

另外,回答你的问题:

为什么?减号是我理解的特殊字符吗?它象征着 “排除”?

对于标准分析器,是的。这并不意味着“排除”,而是一个特殊的字符,在分析后将被删除

来自documentation

为什么术语查询与我的文档不匹配?

[...] 分析文本的方法有很多:默认标准 分析器删除大多数标点符号,将文本分解为单个单词, 并将它们小写。例如,标准分析仪会转 字符串“Quick Brown Fox!”进入术语 [quick, brown, fox]。 [...]

示例:

如果你有以下文字:

"The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."

然后标准分析器会产生:

[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]

如果您不想使用分析仪,您有 2 个解决方案:

  • 您可以使用match query
  • 您可以要求 ElasticSearch 在创建索引时不要分析该字段:here's how

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,@Mickael 的回答非常适合理解发生了什么(我真的建议您阅读链接的文档)。

    我通过为查询定义一个operator 来解决这个问题:

    GET http://localhost:9200/creative/_search
    
    {  
      "query": {
        "match": {
          "keyword_id": {
            "query": "fake-keyword-uuid-3",
            "operator": "AND"
           }
        }
      }
    }
    

    为了更好地理解此查询使用的算法,请尝试添加"explain": true并分析结果:

    GET http://localhost:9200/creative/_search
    
    {  
      "explain": true,
      "query": // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-03
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 2013-06-03
      • 1970-01-01
      • 2022-06-29
      相关资源
      最近更新 更多