为了账号安全,请及时绑定邮箱和手机立即绑定

如何组合多个查询?

如何组合多个查询?

largeQ 2022-10-18 15:43:19
我有数百万个文档要索引。每个文档都有字段doc_id和doc_title几个字段doc_content。import requestsindex = 'test'JSON = {    "mappings": {        "properties": {            "doc_id":      {"type": "keyword"},            "doc_title":   {"type": "text"   },            "doc_content": {"type": "text"   }        }    }}r = requests.put(f'http://127.0.0.1:9200/{index}', json=JSON)为了最小化索引的大小,我保留doc_title并doc_content分开。docs = [    {"doc_id": 1, "doc_title": "good"},    {"doc_id": 1, "doc_content": "a"},    {"doc_id": 1, "doc_content": "b"},    {"doc_id": 2, "doc_title": "good"},    {"doc_id": 2, "doc_content": "c"},    {"doc_id": 2, "doc_content": "d"},    {"doc_id": 3, "doc_title": "bad"},    {"doc_id": 3, "doc_content": "a"},    {"doc_id": 3, "doc_content": "e"}]for doc in docs:    r = requests.post(f'http://127.0.0.1:9200/{index}/_doc', json=doc)查询_1:JSON = {    "query": {        "match": {            "doc_title": "good"        }    }}r = requests.get(f'http://127.0.0.1:9200/{index}/_search', json=JSON)[x['_source'] for x in r.json()['hits']['hits']][{'doc_id': 1, 'doc_title': 'good'}, {'doc_id': 2, 'doc_title': 'good'}]查询_2:JSON = {    "query": {        "match": {            "doc_content": "a"        }    }}r = requests.get(f'http://127.0.0.1:9200/{index}/_search', json=JSON)[x['_source'] for x in r.json()['hits']['hits']][{'doc_id': 1, 'doc_content': 'a'}, {'doc_id': 3, 'doc_content': 'a'}]如何结合 query_1 和 query_2?我需要这样的东西:JSON = {    "query": {        "bool": {            "must": [                {"match": {"doc_title": "good"}},                {"match": {"doc_content": "a"}}            ]        }    }}r = requests.get(f'http://127.0.0.1:9200/{index}/_search', json=JSON)[x['_source'] for x in r.json()['hits']['hits']][]期望的结果:[{'doc_id': 1, 'doc_title': 'good', 'doc_content': 'a'}]
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

分开doc_title&是不好的做法doc_content——你并没有真正减少任何东西。


跟着这个:


docs = [

    {"doc_id": 1, "doc_title": "good", "doc_content": ["a", "b"]},

    {"doc_id": 2, "doc_title": "good", "doc_content": ["c", "d"]},

    {"doc_id": 3, "doc_title": "bad", "doc_content": ["a", "e"]}

]


for doc in docs:

    r = requests.post(f'http://127.0.0.1:9200/{index}/_doc', json=doc)

并且您的查询将按预期工作。a无论如何都b应该被共享doc_id=1,不是吗?


更新——使contents语法嵌套


PUT test

{

  "mappings": {

      "properties": {

        "contents": {

          "type": "nested",

          "properties": {

            "doc_content": {

              "type": "text"

            }

          }

        },

        "doc_id": {

          "type": "keyword"

        },

        "doc_title": {

          "type": "text"

        }

      }


  }

}


POST test/_doc

{

  "doc_id": 1,

  "doc_title": "good",

  "contents": [

    {"doc_content": "a"},

    {"doc_content": "b"}

  ]

}


GET test/_search

{

  "_source": ["doc_title", "inner_hits"], 

  "query": {

    "bool": {

      "must": [

        {

          "match": {

            "doc_title": "good"

          }

        },

        {

          "nested": {

            "path": "contents",

            "query": {

              "match": {

                "contents.doc_content": "a"

              }

            },

            "inner_hits": {}

          }

        }

      ]

    }

  }

}

屈服


[

  {

    "_index":"test",

    "_type":"_doc",

    "_id":"sySOoXEBdiyDG0RsIq21",

    "_score":0.98082924,

    "_source":{

      "doc_title":"good"               <------

    },

    "inner_hits":{

      "contents":{

        "hits":{

          "total":1,

          "max_score":0.6931472,

          "hits":[

            {

              "_index":"test",

              "_type":"_doc",

              "_id":"sySOoXEBdiyDG0RsIq21",

              "_nested":{

                "field":"contents",

                "offset":0

              },

              "_score":0.6931472,

              "_source":{

                "doc_content":"a"          <-----

              }

            }

          ]

        }

      }

    }

  }

]


查看完整回答
反对 回复 2022-10-18
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信