如何在Elasticsearch中对相同字段进行精确值匹配查询?

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

因此,如果将此字段映射为not_analyzed一个,则可以使用术语过滤器进行精确值搜索,如果我在该精确结构中搜索值(类似于1 / 2014、15 /

2014等),则可以正常工作,例如sql equals(=)

{

"query": {

"filtered": {

"filter": {

"term": {

"processNumber": "11/2014"

}

}

}

}

}

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

但是,如果将字段定义为not_analyzed,则无法sql LIKE使用match_phrase查询进行类型搜索。

{

"query": {

"match_phrase": {

"processNumber": "11/201"

}

}

}

在这种情况下,搜索11,11 /,/

2014或2014应该返回匹配,但不会返回。问题是,如果该字段未映射为一个,则此查询有效not_analyzed。因此,似乎我必须使用其中之一,问题是该字段应支持两个选项以用于不同的查询,我在这里遗漏了什么吗?

回答:

您可以使用映射中的fields属性以不同的方式

分析同一字段 processNumber

例如,如果要使用ProcessNumber的经过分析和未经分析的版本,则映射为:

 {

"type_name": {

"properties": {

"processNumber": {

"type": "string",

"index": "not_analyzed",

"fields": {

"analyzed": {

"type": "string",

"index": "analyzed"

}

}

}

}

}

}

在查询中将未分析的字段称为 。

要引用该字段的分析视图,请使用

查询术语11 / 201、11等将是:

示例过滤器:

 { "query" : { "filtered" : { "filter" : { "term" : { "processNumber" : "11/2014" } } } } }

术语过滤器不分析搜索字符串,因此在这种情况下,输入将与字段倒排索引匹配:11/2014针对该字段。

示例Match_Phrase_prefix:

{ "query": { "match_phrase_prefix": { "processNumber": "11/201" } } }

match_phrase_prefix尝试检查短语中的最后一项是否为index中各项的前缀。如果指定了分析器,它将分析搜索字符串。这就是您需要在此处使用该字段的未

分析 版本的原因。如果我们使用 processNumber.analyzed 搜索查询,例如 也将匹配

匹配示例:

  { "query": { "match": { "processNumber.analyzed": "11" } } }

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

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

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

以上是 如何在Elasticsearch中对相同字段进行精确值匹配查询? 的全部内容, 来源链接: utcz.com/qa/435134.html

回到顶部