Elasticsearch完成建议器在多字段上具有不同的权重

Har*_*ang 10 elasticsearch search-suggestion

我在Elasticsearch中使用Completion Suggester来允许部分单词匹配查询.在我的索引(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"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的数据:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

POST /product_index/_search

"suggest": {
  "product_suggest": {
    "text": 'coca-co',
    "completion": {
      "field": 'suggest'
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,除了我想给product_name字段赋予比品牌字段更高的权重.有什么办法可以实现吗?我已经查看了有关使用bool查询的这篇文章,但我对Elasticsearch很新,并且不确定如何在完成建议器的情况下应用它.

非常感谢!

red*_*dox 14

完成建议实际上在得分方面非常有限:你不能这样做.您唯一能做的就是提升一些条目,但不是条目中的属性(参见weight选项http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html#indexing).

那是因为Completion Suggester没有进行"真正的搜索" - >它不使用索引.它是一个简单的"字典",旨在比使用索引+反向列表更快地进行"前缀"扩展.

您应该尝试一下Algolia - >该引擎旨在实时回答前缀搜索+每个属性具有不同的"权重".以下是实施针对多个字段的自动完成菜单的教程:https://www.algolia.com/doc/tutorials/auto-complete

  • 但是Algolia是一个SaaS ......与Elasticsearch相反,你可以在你自己的系统上安装...... (3认同)

Hes*_*oon 9

正如redox所说,完成建议非常简单,并且不支持条目提升.我的解决方案是制作两个建议字段,一个用于品牌,另一个用于产品名称:

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"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

建立索引时,请填写以下两个字段:

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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

查询时,请在品牌和产品建议上提出建议:

POST /product_index/_search
{
    "suggest": {
      "product_suggestion": {
        "text": "coca-co",
        "completion": {
          "field": "product-suggest"
        }
      },
      "brand_suggestion": {
        "text": "coca-co",
        "completion": {
          "field": "brand-suggest"
        }
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在删除重复项之后,将品牌建议的建议列表添加到产品建议中,仅提供相关建议的建议列表,没有重复项和产品建议.

另一种解决方案是使用提升品牌和产品的查询,而不是使用建议者.然而,由于它不使用建议器,因此该实现较慢.