问题描述
我是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;