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”,有什么原因吗?