匹配弹性搜索中的字符串和减号字符

时间:2017-05-18 09:08:36

标签: elasticsearch

所以在DB中我有这个条目:

Mark-Whalberg

使用术语

进行搜索时
Mark-Whalberg

我不配。

为什么呢?减去一个我理解的特殊字符?它象征着“排除”?

查询是这样的:

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

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

Mark
Whalberg
hlb
Mark Whalberg

返回一个匹配。

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

-------------- EDIT --------------

这是当前的查询:

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

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

2 个答案:

答案 0 :(得分:3)

您有分析仪配置问题。

让我解释一下。在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

我希望这会对你有所帮助。

答案 1 :(得分:0)

我遇到了同样的问题,@ 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": // ...
}