如何提高一个布尔查询中查询索引(How to boost indices query inside

2019-09-28 15:19发布

所以,我想要做到的,是每指数定制搜索域部分匹配。 我产生match_phrase_prefix与要搜索的值,如果超过一个字,我生成每个字一个又一个。(我可以使用prefix ,但窃听,或者已经无证设置)。

在这种情况下,我试图来查找"belden cable" ; 查询看起来是这样的:

{
    "query":{
        "bool":{
            "should":
            [
                {
                    "indices":{
                        "indices":["addresss"],
                        "query":{
                            "bool":{
                                "should":
                                [
                                    {"match_phrase_prefix":{"name":"BELDEN CABLE"}}
                                    {"match_phrase_prefix":{"name":"BELDEN"}},
                                    {"match_phrase_prefix":{"name":"CABLE"}}
                                ]
                            }
                        },
                        "no_match_query":"none"
                    }
                },
                {
                    "indices":{
                        "indices":["customers"],
                        "query":{
                            "bool":{
                                "should":[
                                    {"match_phrase_prefix":{"_all":"BELDEN CABLE"}},
                                    {"match_phrase_prefix":{"_all":"CABLE"}},
                                    {"match_phrase_prefix":{"_all":"BELDEN"}}
                                ]
                            }
                        },
                    "no_match_query":"none"
                }
            }
        ]
    }
}

我的目标搜索是获得该有结果的"belden cable"第一,然后是搜索只是"belden""cable"

这返回(通过实施例)4分的结果有"belden cable" ,那么仅具有一个结果"cable" ,然后的结果更"belden cable"

我怎样才能提高有搜索的完整价值的结果?(“百通电缆”)

我试过分开的两个词,分离词索引查询,但它给了最坏结果的相关性。

此外,我一直在使用内部升压声明试图match_phrase_prefix"belden cable"没有结果的变化..

Answer 1:

你真正需要的是分析输入数据的方式不同。 请参见下面的东西,应该是一个起点,最终的解决方案(因为你需要考虑的全套为您的查询和数据分析的要求)。 与ES搜索不仅是查询,但也对你如何组织和准备数据

这个想法是,你希望自己的数据进行分析,使belden cable保持原样。 用的映射"name": {"type": "string"}standard正在被使用,这意味着术语的索引列表是分析器beldencable 。 你真正需要的是[ belden cablebeldencable 。 所以,我认为在暗示shingles令牌过滤器。

DELETE /addresss
PUT /addresss
{
  "settings": {
    "analysis": {
      "analyzer": {
        "analyzer_shingle": {
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase",
            "shingle"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "analyzer_shingle"
        }
      }
    }
  }
}
DELETE /customers
PUT /customers
{
  "settings": {
    "analysis": {
      "analyzer": {
        "analyzer_shingle": {
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase",
            "shingle"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "_all": {
        "analyzer": "analyzer_shingle"
      }
    }
  }
}

POST /addresss/test/_bulk
{"index":{}}
{"name": "belden cable"}
{"index":{}}
{"name": "belden cable yyy"}
{"index":{}}
{"name": "belden cable xxx"}
{"index":{}}
{"name": "belden bla"}
{"index":{}}
{"name": "cable bla"}

POST /customers/test/_bulk
{"index":{}}
{"field1": "belden", "field2": "cable"}
{"index":{}}
{"field1": "belden cable yyy"}
{"index":{}}
{"field2": "belden cable xxx"}
{"index":{}}
{"field2": "belden bla"}
{"index":{}}
{"field2": "cable bla"}

GET /addresss,customers/test/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "indices": {
            "indices": [
              "addresss"
            ],
            "query": {
              "bool": {
                "should": [
                  {
                    "match_phrase_prefix": {
                      "name": "BELDEN CABLE"
                    }
                  },
                  {
                    "match_phrase_prefix": {
                      "name": "BELDEN"
                    }
                  },
                  {
                    "match_phrase_prefix": {
                      "name": "CABLE"
                    }
                  }
                ]
              }
            },
            "no_match_query": "none"
          }
        },
        {
          "indices": {
            "indices": [
              "customers"
            ],
            "query": {
              "bool": {
                "should": [
                  {
                    "match_phrase_prefix": {
                      "_all": "BELDEN CABLE"
                    }
                  },
                  {
                    "match_phrase_prefix": {
                      "_all": "CABLE"
                    }
                  },
                  {
                    "match_phrase_prefix": {
                      "_all": "BELDEN"
                    }
                  }
                ]
              }
            },
            "no_match_query": "none"
          }
        }
      ]
    }
  }
}


文章来源: How to boost indices query inside a boolean query