【问题标题】:Search a list of comma separated strings on elasticsearch在 elasticsearch 上搜索逗号分隔的字符串列表
【发布时间】:2021-05-29 03:43:49
【问题描述】:

我为我的 django 项目配置了 elasticsearch。 Elasticsearch 索引有两个字段 user_id 和 address,我的目标是在 elasticsearch 上搜索逗号分隔的地址列表。

例子:

我有这个地址列表 ["abc", "def","ghi","jkl","mno"] 我想在 elasticsearch 上一键搜索它们,我期待的结果如果这三个地址“abc”、“def”和“ghi”(分别)在地址字段中存在于elasticsearch中,则上述列表为[“abc”、“def”、“ghi”]。

【问题讨论】:

  • 如果有用请记得给答案投票
  • @llermaly 很抱歉,我的投票率太低,所以我无法投票,谢谢您的回答

标签: python django elasticsearch


【解决方案1】:

摄取数据

POST test_foki/_doc
{
  "user_id": 1,
  "address": "abc"
}

POST test_foki/_doc
{
  "user_id": 2,
  "address": "def"
}

POST test_foki/_doc
{
  "user_id": 3,
  "address": "ghi"
}

如果您想进行完全匹配,则可以使用terms query 按地址数组进行过滤。

请求

我们使用过滤器是因为我们不关心精确匹配的得分(匹配与否)

POST test_foki/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "address.keyword": [
              "abc",
              "def",
              "ghi",
              "jkl",
              "mno"
            ]
          }
        }
      ]
    }
  }
}

回应

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test_foki",
        "_type" : "_doc",
        "_id" : "YzkL4HcBv0SJscHMrZB8",
        "_score" : 1.0,
        "_source" : {
          "user_id" : 1,
          "address" : "abc"
        }
      },
      {
        "_index" : "test_foki",
        "_type" : "_doc",
        "_id" : "ZDkL4HcBv0SJscHMsZAx",
        "_score" : 1.0,
        "_source" : {
          "user_id" : 2,
          "address" : "def"
        }
      },
      {
        "_index" : "test_foki",
        "_type" : "_doc",
        "_id" : "ZTkL4HcBv0SJscHMtpAd",
        "_score" : 1.0,
        "_source" : {
          "user_id" : 3,
          "address" : "ghi"
        }
      }
    ]
  }
}

如果你想进行全文搜索,你必须做一个boolean query

POST test_foki/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "address": "abc"
          }
        },
        {
          "match": {
            "address": "def"
          }
        },
        {
          "match": {
            "address": "ghi"
          }
        },
        {
          "match": {
            "address": "jkl"
          }
        },
        {
          "match": {
            "address": "mno"
          }
        }
      ]
    }
  }
}

这会产生相同的 Lucene 查询 address:abc address:def address:ghi address:jkl address:mno

POST test_foki/_search
{
  "query": {
    "match": {
      "address": "abc def ghi jkl mno"
    }
  }
}

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多