弹性搜索移动产品的自定义评分

时间:2016-07-03 17:03:13

标签: elasticsearch catalog elasticsearch-2.0

我正在使用弹性搜索2.3 在删除所有停用词后,我已将所有移动产品存储在ES中(例如,使用,额外等)

“Micromax Canvas Doodle 4白色带8 GB内存和8gb内存”的示例架构:

"_source": {
   "internal_mem": "8 GB",
   "color": "White",
   "brand": "Micromax",
   "ram": "8 GB",
   "model": "Canvas Doodle 4"
}

ES拥有数千个具有这些功能的移动名称。现在,我需要搜索这些产品。 对于搜索,我确实将所有产品分解为属性。因此,搜索“canvas doodle 4 gb”将是:

{
    "query": {
        "bool": {
            "should": [{
                "match": {
                    "model": {
                        "query": "canvas^4 doodle",
                        "boost": 2
                    }
                }
            }, {
                "match": {
                    "internal_mem": {
                        "query": "4 GB",
                        "boost": 0.2
                    }
                }
            }]
        }
    }
}

我想要的结果

  1. 首先是“canvas doodle 4g​​”或“canvas doodle”的所有产品(按分数排序)
  2. 然后,产品有“画布”
  3. 然后“4g”
  4. 我制定的规则:

    1. 模型,与其他三个相比,品牌应该具有更高的优先级
    2. 模特/品牌的第一个词应该更重要。例如Iphone,帆布等。
    3. 的问题:

      1. 我应该使用此查询还是应该进行function_score查询(我还需要自定义分数)?

      2. 如何避免模型中“4”的搜索结果?例如“4”,“迷你”,“3g”,“4g” 我应该禁用IDF以避免这样的结果吗?

      3. 优先考虑模特/品牌的第一句话? (假设它们更重要,例如画布中的“画布”涂鸦3“)

      4. 不同属性的“提升”的推荐值?

      5. 对任何建议/改进持开放态度。请建议。

1 个答案:

答案 0 :(得分:0)

请尝试以下查询。

{
  "query": {
    "filtered": {
        "query": {
            "bool": {
                "should": [{
                    "multi_match": {
                        "query": "canvas doodle 4",
                        "fields": ["model"],
                        "operator": "and"
                    }
                }, {
                    "multi_match": {
                        "query": "canvas doodle 4",
                        "fields": ["model"],
                        "type": "phrase_prefix"
                    }
                }, {
                    "multi_match": {
                        "query": "canvas doodle 4",
                        "fields": ["model"],
                        "type": "phrase"
                    }
                }]
            }
        }
    }
}

这样可以检查 canvas doodle 4 ,然后是短语前缀,然后是词组查询。