通过标记筛选文档的最快方法是什么?

时间:2018-06-28 06:16:01

标签: elasticsearch

索引中的文档可以具有用于预过滤的不同标志,例如INVALIDPRIVATE等。每个标志都覆盖文档的不同方面,因此它们彼此之间不相关,即它们实际上是布尔值。

目标:在运行计分查询之前,找到最快的方法来过滤这些文档。

选项:

  • 为每个标记创建Boolean Field字段,以便可以通过true或false过滤它们。
  • 为每个标志创建一个Keyword Field字段,因此,如果该条目具有值或为NULL,则可以通过Exists Query对其进行过滤。
  • 为所有标志创建一个Text Field字段,以便可以通过常规Match Query过滤它们
  • 我没想到的其他方法。

谢谢您的建议!

1 个答案:

答案 0 :(得分:1)

因此,我对此进行了测试,并得到以下结果:

TL; DR::如果需要一次查询多个标志,请使用布尔字段作为标志。如果您只需要查询一个标志值,则使用任何您喜欢的标志。


索引中的文档:10.000.000

标志字段:

  • nullFlag,可能的值:null"exists",查询:Exists Query
  • booleanFlag,可能的值:truefalse,查询:Term Query
  • textFlag,可能的值:VALIDINVALIDDUMMY_FLAG1DUMMY_FLAG2DUMMY_FLAG3,查询:Match Query < / li>

注释:

  • 用于测试的所有标志平均分布,约为50/50。总是会出现“虚拟标志”,以使该字段更“现实”。
  • 节点查询缓存已通过index.queries.cache.enabled: false禁用。
  • 由于JVM启动,首次运行可能会变慢。我确认查询缓存已禁用。
  • 查询是由本机Java QueryBuilder提供的,请忽略adjust_pure_negativeboost
  • 我不知道查询是最优的还是正确的。

结果:

  • Exists Query似乎是最慢的
  • 通过Term Query过滤布尔值并通过Match Query检查文本标志似乎没有什么不同,如果,您仅过滤一个标志。
  • 如果要过滤多个标志,则通过Term Query的布尔值会更快。
  • 我不知道查询是最优的还是正确的。

测试

booleanFlag-字词查询

查询:

{
  "bool" : {
    "filter" : [
      {
        "term" : {
          "booleanFlag" : {
            "value" : true,
            "boost" : 1.0
          }
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |     91ms |    4998613
2     |     45ms |    4998613
3     |     46ms |    4998613
4     |     45ms |    4998613
5     |     45ms |    4998613

查询:

{
  "bool" : {
    "filter" : [
      {
        "term" : {
          "booleanFlag" : {
            "value" : false,
            "boost" : 1.0
          }
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |     97ms |    5001387
2     |     45ms |    5001387
3     |     45ms |    5001387
4     |     48ms |    5001387
5     |     45ms |    5001387

nullFlag-存在查询

查询:

{
  "bool" : {
    "filter" : [
      {
        "bool" : {
          "must" : [
            {
              "exists" : {
                "field" : "nullFlag",
                "boost" : 1.0
              }
            }
          ],
          "adjust_pure_negative" : true,
          "boost" : 1.0
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |     99ms |    4999305
2     |     53ms |    4999305
3     |     53ms |    4999305
4     |     53ms |    4999305
5     |     54ms |    4999305

查询:

{
  "bool" : {
    "filter" : [
      {
        "bool" : {
          "must_not" : [
            {
              "exists" : {
                "field" : "nullFlag",
                "boost" : 1.0
              }
            }
          ],
          "adjust_pure_negative" : true,
          "boost" : 1.0
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |    145ms |    5000695
2     |    107ms |    5000695
3     |    104ms |    5000695
4     |    104ms |    5000695
5     |    107ms |    5000695

textFlag-匹配查询

查询:

{
  "bool" : {
    "filter" : [
      {
        "match" : {
          "textFlag" : {
            "query" : "VALID",
            "operator" : "OR",
            "prefix_length" : 0,
            "max_expansions" : 50,
            "fuzzy_transpositions" : true,
            "lenient" : false,
            "zero_terms_query" : "NONE",
            "auto_generate_synonyms_phrase_query" : true,
            "boost" : 1.0
          }
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |     87ms |    4998937
2     |     43ms |    4998937
3     |     44ms |    4998937
4     |     43ms |    4998937
5     |     42ms |    4998937

查询:

{
  "bool" : {
    "filter" : [
      {
        "match" : {
          "textFlag" : {
            "query" : "INVALID",
            "operator" : "OR",
            "prefix_length" : 0,
            "max_expansions" : 50,
            "fuzzy_transpositions" : true,
            "lenient" : false,
            "zero_terms_query" : "NONE",
            "auto_generate_synonyms_phrase_query" : true,
            "boost" : 1.0
          }
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |     89ms |    5001063
2     |     48ms |    5001063
3     |     43ms |    5001063
4     |     43ms |    5001063
5     |     43ms |    5001063

-----使用多个标志进行测试------

textFlag-带有2个标志的匹配查询

查询:

{
  "bool" : {
    "filter" : [
      {
        "match" : {
          "textFlag" : {
            "query" : "VALID DUMMY_FLAG1",
            "operator" : "OR",
            "prefix_length" : 0,
            "max_expansions" : 50,
            "fuzzy_transpositions" : true,
            "lenient" : false,
            "zero_terms_query" : "NONE",
            "auto_generate_synonyms_phrase_query" : true,
            "boost" : 1.0
          }
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |    151ms |   10000000
2     |    105ms |   10000000
3     |    106ms |   10000000
4     |    105ms |   10000000
5     |    107ms |   10000000

booleanFlag-带有2个标志的词条查询

查询:

{
  "bool" : {
    "filter" : [
      {
        "term" : {
          "booleanFlagOne" : {
            "value" : true,
            "boost" : 1.0
          }
        }
      },
      {
        "term" : {
          "booleanFlagTwo" : {
            "value" : false,
            "boost" : 1.0
          }
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |    138ms |    2500645
2     |     84ms |    2500645
3     |     84ms |    2500645
4     |     83ms |    2500645
5     |     86ms |    2500645

-----更多测试------

nullFlag-存在查询(没有不必要的双重查询)

查询:

{
  "bool" : {
    "filter" : [
      {
        "exists" : {
          "field" : "nullFlag",
          "boost" : 1.0
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |     93ms |    5000779
2     |     42ms |    5000779
3     |     43ms |    5000779
4     |     42ms |    5000779
5     |     44ms |    5000779

查询:

{
  "bool" : {
    "must" : [
      {
        "exists" : {
          "field" : "nullFlag",
          "boost" : 1.0
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |     88ms |    5000779
2     |     43ms |    5000779
3     |     42ms |    5000779
4     |     43ms |    5000779
5     |     42ms |    5000779

查询:

{
  "bool" : {
    "must_not" : [
      {
        "exists" : {
          "field" : "nullFlag",
          "boost" : 1.0
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

结果:

Run   |     Time |       Hits
1     |    139ms |    4999221
2     |     96ms |    4999221
3     |     98ms |    4999221
4     |     95ms |    4999221
5     |     94ms |    4999221