Как объединить несколько запросов? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть миллионы документов для индексации. Каждый документ имеет поля doc_id, doc_title и несколько полей doc_content.

import requests

index = '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)

query_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 '}]

query_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 Ответ

1 голос
/ 22 апреля 2020

Это плохая практика - отделять doc_title & doc_content - вы ничего не минимизируете.

Go с этим:

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"          <-----
              }
            }
          ]
        }
      }
    }
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...