Эксперт по завершению Elasticsearch на мультифилде с разным весом

Я использую Completion Suggestester в Elasticsearch, чтобы разрешить частичные запросы на совпадение. В моем индексе (products_index) я хотел бы запросить как поле product_name, так и поле бренд. Вот мои сопоставления:

POST /product_index

mappings: {
  products: {
    properties: {
      brand: {
        type: "string",
        analyzer: "english"
      },
      product_name: {
        type: "string",
        analyzer: "english"
      },
      id: {
        type: "long"
      },
      lookup_count: {
        type: "long"
      },
      suggest: {
        type: "completion",
        analyzer: "simple",
        payloads: true,
        preserve_separators: true,
        preserve_position_increments: true,
        max_input_length: 50
      },
      upc: {
        type: "string"
      }
    }
  }
}

Вот мои данные:

POST /product_index/products/2
{
  id: 2,
  brand: "Coca-Cola",
  product_name: "Classic Coke",
  suggest: {
    input: [
      "Classic Coke",
      "Coca-Cola"
    ],
    output: "Classic Coke - Coca-Cola",
    payload: {
      id: 2,
      product_name: "Classic Coke",
      brand: "Coca-Cola",
      popularity: 10
    },
    weight: 0
  }
}

И вот мой запрос:

POST /product_index/_search

"suggest": {
  "product_suggest": {
    "text": 'coca-co',
    "completion": {
      "field": 'suggest'
    }
  }
}

Это отлично работает, за исключением того, что я хотел бы присвоить поле product_name более высокое значение, чем поле бренда. Есть ли способ добиться этого? Я рассмотрел статью при использовании запросов bool, но я совершенно не знаком с Elasticsearch и не знаю, как я могу применить что в случае завершения экзаменатора.

Спасибо большое!

Ответ 1

Как сказал редокс, эксперт по завершению строительства действительно прост и не поддерживает повышение позиций. Мое решение состояло бы в том, чтобы создать два поля для инспекторов, один для бренда и один для названия продукта:

POST /product_index
{
  "mappings": {
    "products": {
      "properties": {
        "brand": {
          "type": "string",
          "analyzer": "english"
        },
        "product_name": {
          "type": "string",
          "analyzer": "english"
        },
        "id": {
          "type": "long"
        },
        "lookup_count": {
          "type": "long"
        },
        "product-suggest": {
          "type": "completion",
          "analyzer": "simple",
          "payloads": true,
          "preserve_separators": true,
          "preserve_position_increments": true,
          "max_input_length": 50
        },
        "brand-suggest": {
          "type": "completion",
          "analyzer": "simple",
          "payloads": true,
          "preserve_separators": true,
          "preserve_position_increments": true,
          "max_input_length": 50
        },
        "upc": {
          "type": "string"
        }
      }
    }
  }
}

При индексировании заполните оба поля:

POST /product_index/products/2
{
  "id": 2,
  "brand": "Coca-Cola",
  "product_name": "Classic Coke",
  "brand-suggest": {
    "input": [
      "Coca-Cola"
    ],
    "output": "Classic Coke - Coca-Cola",
    "payload": {
      "id": 2,
      "product_name": "Classic Coke",
      "brand": "Coca-Cola",
      "popularity": 10
    }
  },
  "product-suggest": {
    "input": [
      "Classic Coke"
    ],
    "output": "Classic Coke - Coca-Cola",
    "payload": {
      "id": 2,
      "product_name": "Classic Coke",
      "brand": "Coca-Cola",
      "popularity": 10
    }
  }
}

При запросе сделайте предложение как для бренда, так и для продукта:

POST /product_index/_search
{
    "suggest": {
      "product_suggestion": {
        "text": "coca-co",
        "completion": {
          "field": "product-suggest"
        }
      },
      "brand_suggestion": {
        "text": "coca-co",
        "completion": {
          "field": "brand-suggest"
        }
      }
    }
}

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

Другим решением было бы использовать запрос с повышением на бренд и продукт, а не на использование советов. Однако эта реализация медленнее, поскольку она не использует подсказки.

Ответ 2

Предложение по завершению на самом деле довольно ограничено с точки зрения подсчета очков: вы не можете этого сделать. Единственное, что вы можете сделать, это повысить некоторые записи, но не атрибуты внутри записи (см. Параметры weight http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html# индексация).

Это потому, что Completion Suggester не выполняет "настоящий поиск" → он не использует индекс. Это простой "словарь", предназначенный для выполнения расширений "префикса" быстрее, чем с индексом + инвертированными списками.

Вы должны попробовать Algolia → движок предназначен для ответа на поиск префиксов в реальном времени + с разными "весами" для каждого атрибута. Вот учебник, чтобы реализовать автоматическое заполнение меню для нескольких полей