Почему этот Composite Secondary couchbase Index соответствует только первому полю в запросе на создание - PullRequest
0 голосов
/ 04 января 2019

Я создал составной индекс для моей корзины заказов, используя этот запрос:

CREATE INDEX idx_customer ON `order` (
buyer.contact.firstName, 
buyer.contact.lastName, 
ALL DISTINCT ARRAY aoc.`value` FOR aoc IN buyer.contact.communicationChannel
WHEN aoc.`communicationChannelCode`= "EMAIL" END)
WHERE _class = "com.lbk.entities.OrderEntity"

Когда я выполняю поиск customer.contact.firstName, запрос совпадает с индексом, но не выполняется для customer.contact.lastName. В основном это соответствует первому полю в запросе.

Вот результат объяснения для ошибочного поля (customer.contact.lastName):

{
  "plan": {
    "#operator": "Sequence",
    "~children": [
      {
        "#operator": "PrimaryScan3",
        "index": "#primary",
        "index_projection": {
          "primary_key": true
        },
        "keyspace": "order",
        "namespace": "default",
        "using": "gsi"
      },
      {
        "#operator": "Fetch",
        "keyspace": "order",
        "namespace": "default"
      },
      {
        "#operator": "Parallel",
        "~child": {
          "#operator": "Sequence",
          "~children": [
            {
              "#operator": "Filter",
              "condition": "(((((`order`.`buyer`).`contact`).`lastName`) = \"jj\") and ((`order`.`_class`) = \"com.lbk.entities.OrderEntity\"))"
            },
            {
              "#operator": "InitialProject",
              "result_terms": [
                {
                  "expr": "(((`order`.`buyer`).`contact`).`lastName`)"
                }
              ]
            },
            {
              "#operator": "FinalProject"
            }
          ]
        }
      }
    ]
  },
  "text": "SELECT buyer.contact.lastName FROM `order` where buyer.contact.lastName = 'jj'\nAND (`_class` = \"com.lbk.entities.OrderEntity\")"
}

Enterprise Edition 5.5.1 сборка 3511

1 Ответ

0 голосов
/ 04 января 2019

Для использования индекса предикат запроса должен иметь в качестве предиката ведущий ключ индекса. Couchbase Bucket может иметь любой тип документов, и нет схемы. Индексатор не будет индексировать, когда в документе пропущен ведущий индексный ключ. Если в начальном ключе индекса нет предиката, запрос также должен содержать значения MISSING, поэтому индекс не будет удовлетворять этому запросу и не будет использоваться.

В вашем случае Добавьте одно из следующего к предикату запроса, если это нормально.

1) AND buyer.contact.firstName IS NOT MISSING
2) AND buyer.contact.firstName IS NOT NULL
3) AND buyer.contact.firstName IS VALUED

Оформить заказ "Разработка индекса для запроса в Couchbase N1QL" в https://blog.couchbase.com/n1ql-practical-guide-second-edition/

...