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)