使用boost

时间:2015-10-28 17:50:15

标签: elasticsearch

我为所有文档设置了索引:

{
  "mappings" {
    "book" {
      "_source": { "enabled": true },
      "properties": [
        "title": { "type": "string", "analyzer": "standard", "search_analyzer": "standard" },
        "description": { "type": "string", "analyzer": "standard", "search_analyzer": "standard" },
        "author": { "type": "string", "analyzer": "standard", "search_analyzer": "standard" }
      ]
    }
  }
}

我将其推送到名为“ library ”的索引中。

想要做的是执行具有以下要求的搜索。假设用户输入了类似“大黄铲”的东西

  1. 以三种方式搜索用户输入的关键字:
    1. 整个短语:“简单的黄色铲子”
    2. 作为一组AND关键词:“简单+黄色+铲子”
    3. 作为一组OR关键词:“simple | yellow | shovel”
  2. 确保关键字集按优先级顺序执行(提升?):
    1. 全文第一
    2. AND'd second
    3. OR'd third
  3. 使用简单的查询可以找到单个搜索:

    {
      "query": {
        "simple_query_string": {
          "query": "\"simple yellow shovel\""
        }
      }
    }
    

    如何使用提升执行多重搜索? 或者我应该在索引字段上使用类似“匹配”查询的内容吗?

2 个答案:

答案 0 :(得分:4)

我不确定我是否正确。我已经假设了优先顺序 作者>标题>描述

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "simple yellow shovel",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "type": "phrase",
                  "boost": 10
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "simple",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 5
                }
              },
              {
                "multi_match": {
                  "query": "yellow",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 5
                }
              },
              {
                "multi_match": {
                  "query": "shovel",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 5
                }
              }
            ]
          }
        },
        {
          "multi_match": {
            "query": "simple",
            "fields": [
              "author^7",
              "title^3",
              "description"
            ],
            "boost": 2
          }
        },
        {
          "multi_match": {
            "query": "yellow",
            "fields": [
              "author^7",
              "title^3",
              "description"
            ],
            "boost": 2
          }
        },
        {
          "multi_match": {
            "query": "shovel",
            "fields": [
              "author^7",
              "title^3",
              "description"
            ],
            "boost": 2
          }
        }
      ]
    }
  }
}

有人可以验证这个吗?您可以参考Boost Query链接获取更多信息。这是你在找什么?

我希望这有帮助!

编辑:用dis_max重写

{
  "query": {
    "bool": {
      "should": [
        {
          "dis_max": {
            "tie_breaker": 0.7,
            "queries": [
              {
                "bool": {
                  "must": [
                    {
                      "multi_match": {
                        "query": "simple yellow shovel",
                        "fields": [
                          "author^7",
                          "title^3",
                          "description"
                        ],
                        "type": "phrase",
                        "boost": 10
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "dis_max": {
                        "tie_breaker": 0.7,
                        "queries": [
                          {
                            "multi_match": {
                              "query": "simple",
                              "fields": [
                                "author^7",
                                "title^3",
                                "description"
                              ],
                              "boost": 5
                            }
                          },
                          {
                            "multi_match": {
                              "query": "yellow",
                              "fields": [
                                "author^7",
                                "title^3",
                                "description"
                              ],
                              "boost": 5
                            }
                          },
                          {
                            "multi_match": {
                              "query": "shovel",
                              "fields": [
                                "author^7",
                                "title^3",
                                "description"
                              ],
                              "boost": 5
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              },
              {
                "multi_match": {
                  "query": "simple",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 2
                }
              },
              {
                "multi_match": {
                  "query": "yellow",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 2
                }
              },
              {
                "multi_match": {
                  "query": "shovel",
                  "fields": [
                    "author^7",
                    "title^3",
                    "description"
                  ],
                  "boost": 2
                }
              }
            ]
          }
        }
      ]
    }
  }
}

这似乎在我的数据集上至少给了我更好的结果。这是了解dismax

的绝佳来源

请用这个玩很多,看看你是否得到了预期的结果。 使用Explain API的帮助。

答案 1 :(得分:2)

我已使用Dis Max Query重写了此内容。请记住,您可以尝试不同的类型以获得更好的结果。见这些:

  1. best_fields
  2. most_fields
  3. cross_fields
  4. 查询:

    POST /your_index/your_type/_search
    {
      "query": {
        "dis_max": {
          "tie_breaker": 0.7,
          "boost": 1.2,
          "queries": [
            {
              "multi_match": {
                "query": "simple yellow showel",
                "type": "phrase",
                "boost": 3,
                "fields": [
                  "title^3",
                  "author^2",
                  "description"
                ]
              }
            },
            {
              "multi_match": {
                "query": "simple yellow showel",
                "operator": "and",
                "boost": 2,
                "fields": [
                  "title^3",
                  "author^2",
                  "description"
                ]
              }
            },
            {
              "multi_match": {
                "query": "simple yellow showel",
                "fields": [
                  "title^3",
                  "author^2",
                  "description"
                ]
              }
            }
          ]
        }
      }
    }
    

    Dis Max查询将选择文档,该文档在所有三个查询中得分最高。我们为"type": "phrase""operator": "and"提供了额外的提升,同时我们保持上次查询不受影响。