如何解决ElasticSearch在多个字段上完全匹配
我是Elastic Search的新手,我试图在Elasticsearch索引中的对象的每个字段上获得完全匹配。例如,我有两个对象:
{
"_index": "sql","_type": "_doc","_id": "mpovsH","_score": 1.0,"_source": {
"entityId": 1,"user": "userfirst","descr": "testfirst",}
},{
"_index": "sql","_source": {
"entityId": 2,"user": "usersecond","descr": "testsecond",}
}
我希望在对象的所有字段上搜索字符串“ userfirst”,并仅获得第一个作为响应。我尝试过:
var searchResponse = client.SearchAsync<MyObject>(s => s
.Source(sf => sf)
.Query(q => q
.MultiMatch(a => a
.Query(queryValue)))).Result;
其中queryValue是“ userfirst”,但是我在结果中都得到了两个对象。我该如何更改?另外,如果可能的话,我不会写每个字段,因为我的对象更大了。
编辑:通过此查询,我仅获得一个结果:
var searchResponse = client.SearchAsync<TendersElasticSearch>(s => s
.Source(sf => sf)
.Query(qn => qn
.MatchPhrasePrefix(ma => ma
.Field(x => x.User)
.Query(queryValue)))).Result;
但是通过此查询,我只能在现场用户上获得结果。我想搜索每个对象的所有字段。有提示吗?
解决方法
添加包含索引数据,映射,搜索查询和搜索结果的工作示例
索引映射:
{
"mappings": {
"properties": {
"users": {
"type": "nested"
}
}
}
}
索引数据:
{
"users": [
{
"entityId": 1,"user": "userfirst","descr": "testfirst"
},{
"entityId": 2,"user": "usersecond","descr": "testsecond"
}
]
}
搜索查询:
{
"query": {
"nested": {
"path": "users","query": {
"bool": {
"must": [
{ "match": { "users.user": "userfirst" }}
]
}
},"inner_hits":{}
}
}
}
使用多重匹配的搜索查询:
{
"query": {
"nested": {
"path": "users","query": {
"bool": {
"must": [
{
"multi_match": {
"query": "userfirst","fields": [
"users.user"
]
}
}
]
}
},"inner_hits": {}
}
}
}
搜索结果:
hits": [
{
"_index": "stof_64061575","_type": "_doc","_id": "1","_nested": {
"field": "users","offset": 0
},"_score": 0.6931471,"_source": {
"entityId": 1,"descr": "testfirst"
}
}
]
,
C#查询:
var searchResponse = client.SearchAsync<MyObject>(s => s
.Source(sf => sf
.Nested(n=>n.Path("users").
Query(qn=>qn.bool(
b=> b.Must(
m => m. .Query(q => q
.MultiMatch(a => a
.Query(queryValue))))))
)
).Result;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。