如何在elasticsearch中的相同字段上创建精确值并匹配查询?

Max*_*ner 8 filter elasticsearch

所以我有一个字段存储格式的值:number/year,如23/2014,24/2014,12/2015等等......

因此,如果此字段被映射为not_analyzed一个,我可以使用术语过滤器进行精确值搜索,如果我搜索该精确结构中的值(类似于1/2014,15/2014,...)它可以工作,就像sql equals(=).

{
  "query": {
    "filtered": {
      "filter": {
        "term": {
          "processNumber": "11/2014"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,使用11 /或/ 2014之类的不同内容进行搜索将不会返回匹配.这可以.

但是,如果我将字段定义为not_analyzed,我不能sql LIKE使用match_phrase查询进行类型搜索.

{
  "query": {
    "match_phrase": {
      "processNumber": "11/201"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,搜索11,11 /,/ 2014或2014应返回命中,但它们不会.问题是,如果字段未映射为一个字段,则此查询有效not_analyzed.所以我似乎要么使用其中一个,问题是该字段应该支持不同查询的两个选项,我在这里遗漏了什么?

kee*_*ety 14

您可以使用映射中的fields属性以不同方式 分析相同的字段processNumber:

例如,如果您想要分析和未分析的ProcessNumber版本,映射将是:

 {
   "type_name": {
      "properties": {
         "processNumber": {
            "type": "string",
            "index": "not_analyzed",
            "fields": {
               "analyzed": {
                  "type": "string",
                  "index": "analyzed"
               }
            }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

未分析字段在查询中称为processNumber的位置.

要参考分析的字段视图,请使用processNumber.analyzed

对术语11/201,11等的查询将是:

示例过滤器:

 { "query" : { "filtered" : { "filter" : { "term" : { "processNumber" : "11/2014" } } } } }
Run Code Online (Sandbox Code Playgroud)

术语过滤器它不会分析搜索字符串,因此输入将与字段反向索引匹配,在这种情况下:11/2014对应字段.

示例Match_Phrase_prefix:

{ "query": { "match_phrase_prefix": { "processNumber": "11/201" } } }
Run Code Online (Sandbox Code Playgroud)

match_phrase_prefix尝试检查短语中的最后一个术语是否是索引中术语的前缀.如果指定了分析器,它会分析搜索字符串.这就是您需要在此处使用该分析的未分析版本的原因.如果我们使用processNumber.analyzed搜索查询,例如 11-201,则11 | 201也会匹配

示例匹配:

  { "query": { "match": { "processNumber.analyzed": "11" } } }
Run Code Online (Sandbox Code Playgroud)

这是直接匹配,因为默认分析器(通常是标准分析器)会将11/2014标记为2014年第11项.

您可以使用analyze api查看默认分析器如何分析特定文本.

curl -XPOST "http://<machine>/_analyze?text=11/2014"
Run Code Online (Sandbox Code Playgroud)