根据http://nest.azurewebsites.net/concepts/writing-queries.html, && 和 || 运算符可用于使用 NEST 库组合两个查询以与 Elastic Search 进行通信。
我设置了以下查询:
var ssnQuery = Query<NameOnRecordDTO>.Match(
q => q.OnField(f => f.SocialSecurityNumber).QueryString(nameOnRecord.SocialSecurityNumber).Fuzziness(0)
);
然后将其与 Bool 查询相结合,如下所示:
var result = client.Search<NameOnRecordDTO>(
body => body.Query(
query => query.Bool(
bq => bq.Should(
q => q.Match(
p => p.OnField(f => f.Name.First)
.QueryString(nameOnRecord.Name.First).Fuzziness(fuzziness)
),
q => q.Match(p => p.OnField(f => f.Name.Last)
.QueryString(nameOnRecord.Name.Last).Fuzziness(fuzziness)
)
).MinimumNumberShouldMatch(2)
) || ssnQuery
)
);
我认为这个查询的意思是,如果匹配,SocialSecurityNumber
或者两个字段都匹配,那么记录应该包含在结果中。Name.First
Name.Last
当我使用调用 QueryString 中使用的 nameOnRecord 对象的以下数据执行此查询时:
"socialSecurityNumber":"123456789",
"name" : {
"first":"ryan",
}
结果是有 SSN 的人123456789
,以及有名字的任何人ryan
。
如果我|| ssnQuery
从上面的查询中删除,我会得到名字是“ryan”的每个人。
使用|| ssnQuery
到位和以下查询:
{
"socialSecurityNumber":"123456789",
"name" : {
"first":"ryan",
"last": "smith"
}
}
我似乎找到了 SSN 为 123456789 的人以及名字为“ryan”或姓氏为“smith”的人。
因此,添加似乎没有|| ssnQuery
达到我预期的效果,我也不知道为什么。
以下是相关对象索引的定义:
"nameonrecord" : {
"properties": {
"name": {
"properties": {
"name.first": {
"type": "string"
},
"name.last": {
"type": "string"
}
}
},
"address" : {
"properties": {
"address.address1": {
"type": "string",
"index_analyzer": "address",
"search_analyzer": "address"
},
"address.address2": {
"type": "string",
"analyzer": "address"
},
"address.city" : {
"type": "string",
"analyzer": "standard"
},
"address.state" : {
"type": "string",
"analyzer": "standard"
},
"address.zip" : {
"type" : "string",
"analyzer": "standard"
}
}
},
"otherName": {
"type": "string"
},
"socialSecurityNumber" : {
"type": "string"
},
"contactInfo" : {
"properties": {
"contactInfo.phone": {
"type": "string"
},
"contactInfo.email": {
"type": "string"
}
}
}
}
}
我认为address
分析器的定义并不重要,因为地址字段没有在查询中使用,但如果有人想看到它可以包含它。