【问题标题】:In Elasticsearch, how to know which element in the array is chosen by the fuzzysearch when querying against a list在 Elasticsearch 中,如何知道在查询列表时模糊搜索选择了数组中的哪个元素
【发布时间】:2023-01-21 15:56:13
【问题描述】:

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

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

当我们搜索用户名时,假设“琼斯很棒" 我们构建了一个如下所示的模糊搜索

{
    "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”,因为此名称相对于输入“jone great”得分很高

问题是我怎么知道以编程方式模糊搜索选择数组中的哪个名称。想象一个用户有 100 个别名,有没有办法告诉 Elasticsearch 指出哪个别名是用户被选为匹配项的原因?

在我们目前的方法中,我们编写了一段代码来扫描 ES 返回的用户的所有别名,并选择可能的最佳别名。这很耗时,尤其是在用户有将近 100 个别名的情况下。

如果我们可以在 ES 查询中添加一些东西并使其突出显示它在数组中选择的名称,那将是最好的。

【问题讨论】:

    标签: elasticsearch full-text-search fuzzy-search


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2020-11-28
      • 2017-11-14
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      相关资源
      最近更新 更多