elasticsearch,Filter,elasticsearch" /> elasticsearch,Filter,elasticsearch" />

Filter 如何在elasticsearch中对同一字段进行精确值和匹配查询?

Filter 如何在elasticsearch中对同一字段进行精确值和匹配查询?,filter,elasticsearch,Filter,elasticsearch,所以我有一个字段,它以如下格式存储一个值:number/year,比如23/2014、24/2014、12/2015等等 因此,如果此字段映射为未分析的字段,我可以使用术语过滤器进行精确的值搜索,如果我搜索该精确结构中的值(如1/2014、15/2014等),它可以工作,如sql equals(=) 因此,使用11/、或/2014等不同的搜索不会返回命中率。这很好 但是如果我将字段定义为not\u analysisd,我就不能用match\u短语查询进行sql类的类型搜索 { "query"

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

因此,如果此字段映射为未分析的
字段,我可以使用术语过滤器进行精确的值搜索,如果我搜索该精确结构中的值(如1/2014、15/2014等),它可以工作,如
sql equals(=)

因此,使用11/、或/2014等不同的搜索不会返回命中率。这很好

但是如果我将字段定义为
not\u analysisd
,我就不能用
match\u短语查询进行
sql类的
类型搜索

{
  "query": {
    "match_phrase": {
      "processNumber": "11/201"
    }
  }
}
在本例中,搜索11,11/、/2014或2014应该会返回命中率,但不会返回。
问题是,如果字段未映射为
not\u analysisd
one,则此查询有效。因此,我似乎必须使用其中一个或另一个,问题是该字段应支持不同查询的两个选项,我是否遗漏了一些内容?

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

例如,如果需要ProcessNumber的已分析和未分析版本,则映射为:

 {
   "type_name": {
      "properties": {
         "processNumber": {
            "type": "string",
            "index": "not_analyzed",
            "fields": {
               "analyzed": {
                  "type": "string",
                  "index": "analyzed"
               }
            }
         }
      }
   }
}
其中未分析字段在查询中称为processNumber

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

对第11/201条、第11条等的查询如下:

 {
   "type_name": {
      "properties": {
         "processNumber": {
            "type": "string",
            "index": "not_analyzed",
            "fields": {
               "analyzed": {
                  "type": "string",
                  "index": "analyzed"
               }
            }
         }
      }
   }
}
示例过滤器:

 { "query" : { "filtered" : { "filter" : { "term" : { "processNumber" : "11/2014" } } } } }
术语过滤器它不分析搜索字符串,因此输入将与字段反向索引(在本例中为:2014年11月)进行匹配

匹配短语前缀示例:

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

示例匹配:

  { "query": { "match": { "processNumber.analyzed": "11" } } }
这是直截了当的,因为默认分析器(通常是标准分析器)将2014年11月11日标记为2014年11月11日

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

curl -XPOST "http://<machine>/_analyze?text=11/2014"
curl-XPOST”http:///_analyze?text=11/2014"

谢谢。我目前正在使用spring与elasticsearch的集成,下面是字段当前的映射方式:@field(type=String,index=FieldIndex.not_analysis)public String processNumber;我不知道是否有办法在这里设置fields属性。好的,我想我已经做到了:@MultiField(mainField=@Field(type=String,index=FieldIndex.not_analysis),otherFields=@NestedField(dotSuffix=“analysis”,type=String,index=FieldIndex.analysis))但是你能告诉我这三个匹配查询之间的区别吗?@Maxrunner编辑了答案,对查询进行了简要的解释。谢谢,这非常有用:)最后一个简短的问题,在对字符串为“Master”的字段使用术语过滤器时,搜索“Master”有效,但不搜索“Master”,有什么原因吗?