ElasticSearch:在两个字段上使用(OR)通配符,并且与一个字段完全匹配

时间:2018-09-20 17:45:32

标签: elasticsearch

我对Elastic世界是非常,并且在理解某些操作背后的逻辑时遇到了很多麻烦。 当前正在研究和尝试很多东西,所以我现在有点困惑,需要一些提示。

场景。 我在client索引中有以下(clients类型)文档(不用担心:名字是足球运动员,电话号码不是真实的):

    {
      "firstName" : "Alessandro",
      "lastName" : "Nesta",
      "phoneNumber" : "+3949304903",
      "merchantId" : "90339203812831293"
    },
    {
      "firstName" : "Alessandro",
      "lastName" : "Del Piero",
      "phoneNumber" : "+39129302902",
      "merchantId" : "90339203812831293"
    },
    {
      "firstName" : "Alessandro",
      "lastName" : "Costacurta",
      "phoneNumber" : "+39098921321",
      "merchantId" : "1239021392839238"
    }

现在,我正在寻找的搜索查询基本上是这样做的:给定一个merchantId和一个查询字符串,请尝试在firstName或lastName内查找查询字符串,但请确保商人ID完全一样在查询中传递。

假设我在SQL世界中有一个查询字符串“ Aless”和一个商人ID“ 90339203812831293”:

SELECT
*
FROM
  `clients`
WHERE
  `merchantId` = "90339203812831293"
AND 
(
  `firstName` LIKE "Aless%" OR `lastName` LIKE "Aless%"
);

结果应该是:

{
  "firstName" : "Alessandro",
  "lastName" : "Nesta",
  "phoneNumber" : "+3949304903",
  "merchantId" : "90339203812831293"
},
{
  "firstName" : "Alessandro",
  "lastName" : "Del Piero",
  "phoneNumber" : "+39129302902",
  "merchantId" : "90339203812831293"
}

我尝试了什么?基本上与组合不同,从将vendorId放入过滤器部分到multi_match。

{
"query": {
  "bool": {
    "should": [
      {
        "wildcard": {
          "firstName": "aless*"
        }
      },
      {
        "wildcard": {
          "lastName": "aless*"
        }
      }
    ],
    "must": {
      "match": {
        "merchantId": "90339203812831293"
      }
    }
  }
}

0个结果(如果我删除了vendorId部分,效果很好)。

我也尝试过使用查询字符串:

{
"query": {
  "bool": {
    "must": {
      "query_string": {
        "query": "Del*",
        "fields": [
          "firstName",
          "lastName"
        ]
      }
    },
    "filter": {
      "term": {
        "merchantId": "90339203812831293"
      }
    }
  }
}
}

同样的问题。 能否请我指出我做错了什么? 预先感谢!

2 个答案:

答案 0 :(得分:0)

这是令人难以置信的,经过一天的无奈尝试,我一问到这里,我终于找到了解决方法:

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "Aless*",
            "fields": [
              "firstName",
              "lastName"
            ]
          }
        },
        {
          "match": {
            "merchant_id": "90339203812831293"
          }
        }
      ]
    }
  }
}

但是,我非常愿意接受新的解决方案,因为我敢肯定这不是最好的解决方案。 如果需要,我什至可以修改文档的结构。

谢谢!

答案 1 :(得分:0)

您尝试过多重匹配吗?

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "Aless",
            "fields": ["firstName", "lastName"]
         }
        },
        {
          "match": {
            "merchant_id": "90339203812831293"
          }
        }
      ]
    }
  }
}

{
  "query": {
    "bool": {
      "must": 
            {
              "multi_match": {
                "query": "Aless",
                "fields": ["firstname", "lastname"]
          }
        },
        "filter": {
          "term": {
            "merchant_id": "90339203812831293"
          }
        }
    }
  }
}