如何用Elasticsearch匹配名字和姓氏?

cu6pst1q  于 2023-01-25  发布在  ElasticSearch
关注(0)|答案(2)|浏览(179)

典型的Elasticsearch JSON响应类似于:

[
    {
        "_index": "articles",
        "_id": "993",
        "_score": 10.443843,
        "_source": {
            "title": "This is a test title",
            "authors": [
                 {
                      first_name: 'john',
                      last_name: 'smith'
                 },

我如何查询其中一个作者是'约翰史密斯'的所有文章?目前我有:

const {
            hits: { hits }
        } = await client.search({
            index: "articles",
            body: {
                query: {
                    bool: {
                        should: [
                            {
                                match: {
                                    "authors.first_name": "john"
                                }
                            },
                            {
                                match: {
                                    "authors.first_name": "Smith"
                                }
                            }
                        ]
                    }
                }
            }
        });

但这将返回名或姓为john或smith的文章,而不是作者为“john smith”的文章。

vs91vp4v

vs91vp4v1#

我认为您在这里遇到的是nested vs. object dilemma,您可以通过将authors字段的类型更改为嵌套类型(您没有共享您的索引Map,所以我在这里假设)并使用以下查询来实现您所寻找的内容

{
   "query":{
      "nested":{
         "path":"authors",
         "query":{
            "bool":{
               "must":[
                  {
                     "match":{
                        "authors.firstName":{
                           "query":"john"
                        }
                     }
                  },
                  {
                     "match":{
                        "authors.lastName":{
                           "query":"Smith"
                        }
                     }
                  }
               ]
            }
         }
      }
   }
}

希望能有所帮助。

du7egjpx

du7egjpx2#

在这种情况下,您使用了“应该”语句,可以解释为

firstname:john OR lastname:smith

这可以很容易地用“必须”来代替,这可以解释为

firstname:john AND lastname:smith

正如rob在他的回答中提到的,嵌套的vs对象确实是一个难题。
但当你处理信息数组时就会出现这种困境。
例如,您有以下条目
条目#1

{
      "serviceType": "mysql",
      "allowedUsers": [
        {
          "firstName": "Daniel",
          "lastName": "Acevedo"
        },
        {
          "firstName": "John",
          "lastName": "Smith"
        },
        {
          "firstName": "Mike",
          "lastName": "K"
        }
      ]
    }

然后执行以下搜索

{
  "size": 10,
  "query": {
    "query_string": {
      "query": "allowedUsers.firstName:john AND allowedUsers.lastName:acevedo"
    }
  }
}

你将在文档中有一个匹配,因为因为firstName和lastName都匹配你的文档,即使他们在不同的用户对象中匹配。2这是一个对象Map的例子。
在这种情况下,没有解决办法,您必须使用NESTEDMap来完成自然匹配。
在您的特定情况下,我认为您不会遇到这种情况,所以使用OBJECT和MUST(AND而不是should(OR))查询应该可以做得很好。
如果你需要进一步的解释,让我知道我会做一个更详细的编辑。
干杯。

相关问题