在Elasticsearch中,当查询列表时,如何知道模糊搜索选择了数组中的哪个元素

jslywgbw  于 2023-01-25  发布在  ElasticSearch
关注(0)|答案(1)|浏览(197)

我有一个棘手的案例,想咨询一下这里的Maven。我们在Elasticsearch中存储用户信息,一个用户可能有不同的别名,所有这些都存储在一个“names”数组中,如下所示

"names" : [
            {
              "userName" : "John Jerry",
              "nameType" : "Primary Name"
            },
            {
              "userName" : "John The Great",
              "nameType" :"Also Known As"
            },
            {
              "userName" : "Jerry Our Father",
              "nameType" :"Also Known As"
            }
]

当我们搜索一个用户名时,假设“jone great”,我们构建一个如下所示的模糊搜索

{
    "span_near": {
      "clauses": [
        {
          "span_multi": {
            "match": {
              "fuzzy": {
                "names.userName": {
                  "value": "jone",
                  "fuzziness": "1",
                  "prefix_length": 0,
                  "max_expansions": 50,
                  "transpositions": true,
                  "boost": 1
                }
              }
            },
            "boost": 1
          }
        },
        {
          "span_multi": {
            "match": {
              "fuzzy": {
                "names.userName": {
                  "value": "great",
                  "fuzziness": "1",
                  "prefix_length": 0,
                  "max_expansions": 50,
                  "transpositions": true,
                  "boost": 1
                }
              }
            },
            "boost": 1
          }
        }
      ],
      "slop": 2,
      "in_order": false,
      "boost": 1
    }
},

此查询将返回上面的用户,其别名为“John The Great”,因为此名称相对于输入“Jones great”具有良好的得分
问题是我如何知道编程模糊搜索选择了数组中的哪个名字。假设一个用户有100个名字别名,有没有办法告诉Elasticsearch指出哪个别名是用户被选择作为匹配的原因?
在我们目前的方法中,我们编写一段代码来扫描ES返回的所有用户别名,并选择最佳的别名。这是非常耗时的,特别是当用户有近100个别名时。
如果我们可以在ES查询中添加一些东西,并使其突出显示它在数组中选择的名称,那将是最好的。

8ehkhllq

8ehkhllq1#

是的,只需使用相同的子句执行嵌套查询,并指定“inner_hits”:{“size”:1}。这将返回顶部匹配的嵌套数组元素。

相关问题