摘要:我试图理解为什么两个看起来复杂度非常相似的查询在执行速度上有很大差异。
我正在使用Elastic Search 6.4,并且有一个要在其上使用语音查询的名称字段。
作为一个示例,我对搜索词“ Mario”进行了语音查询,发现背景中的Lucene正在将其作为SynonymQuery执行:
"type": "SynonymQuery",
"description": "Synonym(person.firstName.phonetic:mYrio person.firstName.phonetic:mari person.firstName.phonetic:mario person.firstName.phonetic:mori person.firstName.phonetic:morio)",
大约有1500万条记录的索引大约需要200毫秒。
由于它似乎将我的单个搜索词转换为5个同义词,因此我想:“好吧,如果我搜索相同的5个词而没有语音,那又会怎样呢?或者换句话说,“不是语音部分使它变慢,而是它必须搜索多个同义词的事实?”
但是事实证明,如果我在没有拼音的情况下查询“ mario mYrio mari mori morio”的字段,则会导致BooleanQuery(每个同义词作为子查询一个子查询):
"type": "BooleanQuery",
"description": "person.firstName:mario person.firstName:mYrio person.firstName:mari person.firstName:mori person.firstName:morio",
仅花费时间的1/10。请注意:我知道并理解这两个查询会给出不同的结果。我不是想用第二个查询来模拟语音搜索。我只是想看看它是否也会变慢,因为这似乎是一个类似复杂性的查询。
对于像我这样刚刚才开始使用Elastic Search的人来说,这两个查询的复杂度看起来非常相似(使用OR运算符搜索5个术语),我不明白为什么一个查询比另一个查询慢得多。
任何见识将不胜感激!
谢谢!
致谢 马里奥
P.S .:我意识到,如果我包含此示例中使用的两个查询,可能会有所帮助:
第一个查询(语音):
{
"profile": true,
"size": 1,
"timeout": "10s",
"query": {
"bool": {
"should": [
{
"match": {
"person.firstName.phonetic": {
"query": "mario",
"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
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
}
第二次查询(非语音)
{
"profile": true,
"size": 1,
"timeout": "10s",
"query": {
"bool": {
"should": [
{
"match": {
"person.firstName": {
"query": "mario myrio mari mori morio",
"operator": "OR",
"fuzziness": "0",
"prefix_length": 3,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
}
答案 0 :(得分:0)
我想说的是,这两者之间有什么区别-rewrite
流程又称术语mario
扩展为现有的同义词。这个过程基本上需要您处理SynonymGraphFilter,我相信它会从磁盘读取有关同义词的数据,这会使事情变慢。
如果是布尔查询,则匹配将通过不同的分析器链(我认为这是相同的语音,但没有同义词)