【问题标题】:ElasticSearch Exact match on multiple fieldsElasticSearch 精确匹配多个字段
【发布时间】:2020-09-25 09:35:30
【问题描述】:

我是 Elastic Search 的新手,我正在尝试对 elasticsearch 索引中对象的每个字段进行精确匹配。例如我有两个对象:

        {
            "_index": "sql",
            "_type": "_doc",
            "_id": "mpovsH",
            "_score": 1.0,
            "_source": {
                "entityId": 1,
                "user": "userfirst",
                "descr": "testfirst",
            }
        },
        {
            "_index": "sql",
            "_type": "_doc",
            "_id": "mpovsH",
            "_score": 1.0,
            "_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;

但是通过这个查询,我只能得到字段用户的结果。我想搜索每个对象的所有字段。有什么建议吗?

【问题讨论】:

    标签: c# linq elasticsearch nest


    【解决方案1】:

    添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例

    索引映射:

    {
      "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,
                        "user": "userfirst",
                        "descr": "testfirst"
                      }
                    }
                  ]
    

    【讨论】:

    • 我可以请你帮忙翻译它在 c# 查询中的嵌套吗?非常感谢!
    • @RobNone 抱歉:(我不熟悉 c# 查询。但上面的 ES 搜索查询会给你推荐的结果:)
    【解决方案2】:

    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;
    

    【讨论】:

    • 我编辑了我的问题,我从你的回答中得到了启发,但仍然无法管理我的对象的所有字段。
    • 要搜索所有字段,您可以使用查询字符串 curl -XPOST 'localhost:9200/_search?pretty' -d '{ "query": { "query_string": { "query" : "用户第一" } } }'
    • 我试过 var searchResponse = client.SearchAsync(s => s .Source(sf => sf) .Query(q => q .QueryString(qs => qs .Query(查询值))))。结果;但不起作用...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多