Elasticsearch default_operator "AND" не работает должным образом - PullRequest
5 голосов
/ 22 марта 2020

Я настроил поиск строки запроса с помощью оператора «И» по умолчанию. Мой запрос выглядит следующим образом:

{
    "query": {
        "query_string" : {
            "query" : "Adam KT2 7AJ",
            "default_operator" : "AND"
         }
    }
}

Я ожидаю, что это даст тот же результат, что и ниже ... но это не так.

{
    "query": {
        "query_string" : {
            "query" : "Adam AND KT2 AND 7AJ",
            "default_operator" : "OR"
         }
    }
}

Пока я вижу Оператор default_ имеет значение для моих результатов поиска, он не работает так, как мне бы хотелось.

Например:

QUERY1:

  • Adam AND KT2 AND 7AJ, default_operator: or
  • Результаты: 1 (как и ожидалось)
  • [1] Имя: Адам Ламберт, Почтовый индекс KT2 7AJ

QUERY2:

  • Adam KT2 7AJ, default_operator: and
  • Результаты: 0
  • (Не ожидается Это должно привести к тем же результатам, что и выше? Кажется and, так как default_operator выдает результаты, отличные от AND в запросе)

QUERY3:

  • KT2 7AJ, default_operator: and
  • Результаты: 2
  • (Как и ожидалось, соответствует только обеим частям почтового индекса)
  • [1] Имя: a , почтовый индекс KT2 7AJ
  • [2] Имя: b , почтовый индекс KT2 7AJ

QUERY4:

  • KT2 7AJ, default_operator: or
  • Результаты: 5
  • (Как и ожидалось, совпадение паролей для различных почтовых индексов)
  • [1] Имя: a , почтовый индекс KT2 7AJ
  • [2] Имя: b , Почтовый индекс KT2 7AJ
  • [3] Имя: c, Почтовый индекс N7 7AJ
  • [4] Имя: d , Почтовый индекс KT2 0DJ
  • [5] Имя: e , Почтовый индекс KT2 0PQ

РЕДАКТИРОВАТЬ

Вот мое отображение. Вы заметите, что в адресе выставления счета есть поле post_code, но есть поля имени, прикрепленные и к shipping_address, и к клиенту.

Когда я запускаю запрос как Adam AND KT2 7AJ, мы получаем результат для которого customer.name:Adam AND billing_address.post_code:KT2 7AJ, чего я и ожидаю.

Если мы удалим AND, мы получим 0 результатов.

{
    "t1_orders_1584882055": {
        "mappings": {
            "properties": {
                "__class_name": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "billing_address": {
                    "properties": {
                        "address1": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "address2": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "address3": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "company": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "country_code": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "created_at": {
                            "type": "date",
                            "format": "date_time"
                        },
                        "customer_id": {
                            "type": "long"
                        },
                        "email": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "id": {
                            "type": "keyword"
                        },
                        "name": {
                            "type": "text",
                            "analyzer": "edge_ngram_analyzer"
                        },
                        "phone": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "post_code": {
                            "type": "text",
                            "fields": {
                                "text": {
                                    "type": "text"
                                }
                            },
                            "analyzer": "no_space_analyzer"
                        },
                        "redacted": {
                            "type": "boolean"
                        },
                        "region": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "town": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "updated_at": {
                            "type": "date",
                            "format": "date_time"
                        }
                    }
                },
                "billing_address_id": {
                    "type": "long"
                },
                "channel": {
                    "properties": {
                        "created_at": {
                            "type": "date"
                        },
                        "id": {
                            "type": "long"
                        },
                        "identifier": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "name": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "updated_at": {
                            "type": "date"
                        }
                    }
                },
                "channel_id": {
                    "type": "long"
                },
                "created_at": {
                    "type": "date",
                    "format": "date_time"
                },
                "customer": {
                    "properties": {
                        "created_at": {
                            "type": "date",
                            "format": "date_time"
                        },
                        "email": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "id": {
                            "type": "keyword"
                        },
                        "name": {
                            "type": "text",
                            "analyzer": "edge_ngram_analyzer"
                        },
                        "redacted": {
                            "type": "boolean"
                        },
                        "updated_at": {
                            "type": "date",
                            "format": "date_time"
                        }
                    }
                },
                "customer_id": {
                    "type": "long"
                },
                "id": {
                    "type": "keyword"
                },
                "name": {
                    "type": "text",
                    "analyzer": "edge_ngram_analyzer"
                },
                "order_id": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "order_items": {
                    "properties": {
                        "created_at": {
                            "type": "date"
                        },
                        "id": {
                            "type": "long"
                        },
                        "order_id": {
                            "type": "long"
                        },
                        "qty": {
                            "type": "long"
                        },
                        "sku": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "updated_at": {
                            "type": "date"
                        }
                    }
                },
                "received_at": {
                    "type": "date",
                    "format": "date_time"
                },
                "reference_number": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "ship_by": {
                    "type": "date"
                },
                "shipping_address": {
                    "properties": {
                        "address1": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "address2": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "address3": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "company": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "country_code": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "created_at": {
                            "type": "date",
                            "format": "date_time"
                        },
                        "customer_id": {
                            "type": "long"
                        },
                        "email": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "id": {
                            "type": "keyword"
                        },
                        "name": {
                            "type": "text",
                            "analyzer": "edge_ngram_analyzer"
                        },
                        "phone": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "post_code": {
                            "type": "text",
                            "fields": {
                                "text": {
                                    "type": "text"
                                }
                            },
                            "analyzer": "no_space_analyzer"
                        },
                        "redacted": {
                            "type": "boolean"
                        },
                        "region": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "town": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "updated_at": {
                            "type": "date",
                            "format": "date_time"
                        }
                    }
                },
                "shipping_address_id": {
                    "type": "long"
                },
                "status": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "updated_at": {
                    "type": "date",
                    "format": "date_time"
                }
            }
        }
    }
}

Пример документа:

{
  "_source": {
    "id": 6,
    "channel_id": 1,
    "customer_id": 1,
    "shipping_address_id": 11,
    "billing_address_id": 12,
    "order_id": "1234",
    "reference_number": "1234",
    "status": "open",
    "received_at": "2020-02-24T18:03:21.000000Z",
    "ship_by": "2020-02-24T18:03:21.000000Z",
    "completed_at": null,
    "created_at": "2020-03-18T16:17:28.000000Z",
    "updated_at": "2020-03-18T16:17:28.000000Z",
    "channel": {
      "id": 1,
      "name": "Amazon",
      "identifier": "The",
      "created_at": "2020-03-18T16:17:28.000000Z",
      "updated_at": "2020-03-18T16:17:28.000000Z"
    },
    "customer": {
      "id": 1,
      "name": "Nam Test",
      "email": "Nam@Test.com",
      "redacted": false,
      "created_at": "2020-03-18T16:17:28.000000Z",
      "updated_at": "2020-03-18T16:17:28.000000Z"
    },
    "shipping_address": {
      "id": 11,
      "customer_id": 1,
      "name": "Nam Test",
      "email": "Nam@Test.COm",
      "company": "",
      "address1": "44",
      "address2": "AD CLOSE",
      "address3": "",
      "town": "KINGSTON UPON THAMES",
      "region": "",
      "post_code": "KT2 7AJ",
      "country_code": null,
      "phone": "213223123",
      "redacted": false,
      "created_at": "2020-03-18T16:17:28.000000Z",
      "updated_at": "2020-03-18T16:17:28.000000Z"
    },
    "billing_address": {
      "id": 12,
      "customer_id": 1,
      "name": "Nam Test",
      "email": "Nam@Test.COm",
      "company": "",
      "address1": "44",
      "address2": "AD CLOSE",
      "address3": "",
      "town": "KINGSTON UPON THAMES",
      "region": "",
      "post_code": "KT2 7AJ",
      "country_code": null,
      "phone": "213223123",
      "redacted": false,
      "created_at": "2020-03-18T16:17:28.000000Z",
      "updated_at": "2020-03-18T16:17:28.000000Z"
    },
    "order_items": [
      {
        "id": 6,
        "order_id": 6,
        "sku": "10-2-sk-ue",
        "qty": 1,
        "created_at": "2020-03-18T16:17:28.000000Z",
        "updated_at": "2020-03-18T16:17:28.000000Z"
      }
    ]
  }
}

1 Ответ

0 голосов
/ 28 марта 2020

Из elasti c поиск версии 6.x разделение по пробелам больше не выполняется.

Объяснение: Взятие двух полей Name и PostalCode

1. Адам И KT2 И 7AJ, default_operator: или Запрос переводится в: - (Имя: Адам ИЛИ Почтовый индекс: Адам) ИЛИ (Имя: KT2 ИЛИ Почтовый код: KT2) ИЛИ (Имя: 7AJ ИЛИ Почтовый индекс: 7AJ) Текст разделяется на операторы (И, ИЛИ), и каждое разбиение передается в соответствующие поля. Таким образом, он возвращает все документы, которые имеют имя Адама и Почтовый код, связанный с 7AJ или KT2 (токены совпадают)

2. Адам И KT2 И 7AJ, default_operator: и Запрос переводится в: - (Имя: Адам ИЛИ Почтовый индекс: Адам) И (Имя: KT2 ИЛИ Почтовый индекс: KT2) И (Имя: 7AJ ИЛИ Почтовый индекс: 7AJ)

3. Adam KT2 7AJ, default_operator: и Запрос переводится в: - (Имя: (Адам И KT2 И 7AJ) ИЛИ Почтовый индекс: (Адам И KT2 И 7AJ)) текст не разбит на пробел (это было сделано до версии 6) и считается блоком текста. Таким образом, возвращается только документ, имеющий все три токена в любом поле

4. KT2 7AJ, default_operator: и То же, что и документ пункта 2, в котором возвращены оба токена в любом поле.

5. KT2 7AJ, default_operator: или То же, что и документ пункта 2 с любым из токенов (OR) в поле.

Эта ссылка имеет аналогичное пояснение elasti c поисковой командой на github

Если вы хотите продолжать использовать существующую структуру, вы можете объединить похожие слова в квадратные скобки. Ниже запрос разделит текст на два токена Адама и один блок KT2 7AJ, который будет переводиться в (Имя: Адам ИЛИ Почтовый индекс: Адам) И (Имя: (KT2 И 7AJ) ИЛИ Почтовый код: (KT2 И 7 АЖ)

{
    "query": {
        "query_string" : {
            "query" : "Adam (KT2 7AJ)",
            "default_operator" : "AND"
         }
    }
}
...