代码之家  ›  专栏  ›  技术社区  ›  Mario Köhler

为什么语音搜索比普通匹配查询慢得多

  •  1
  • Mario Köhler  · 技术社区  · 7 年前

    小结:我试图理解为什么两个在复杂性上看起来非常相似的查询在执行速度上大不相同。

    我正在使用弹性搜索6.4,我有一个名称字段,我想使用语音查询。

    例如,我分析了搜索词“Mario”的语音查询,发现背景中的Lucene正在执行同义词查询:

            "type": "SynonymQuery",
            "description": "Synonym(person.firstName.phonetic:mYrio person.firstName.phonetic:mari person.firstName.phonetic:mario person.firstName.phonetic:mori person.firstName.phonetic:morio)",
    

    由于它似乎将我的单个搜索词转换为5个同义词,我想“好吧,如果我搜索相同的5个词而不使用拼音怎么办?它会同样慢吗?”或者换句话说,“不是拼音部分使它慢,而是它必须搜索多个同义词的事实?”

    但是,如果我在没有拼音的情况下查询“mario mYrio mari mori mori mori morio”字段,结果将是一个布尔查询(每个同义词作为子词查询一个术语):

            "type": "BooleanQuery",
            "description": "person.firstName:mario person.firstName:mYrio person.firstName:mari person.firstName:mori person.firstName:morio",
    

    这只需要十分之一的时间。请注意:我知道并理解这两个查询给出不同的结果。我不想用第二个查询模拟语音搜索。我只是想看看它是否也会很慢,因为它似乎是一个具有类似复杂性的查询。

    对于像我这样最近才开始使用弹性搜索的人来说,这两个查询在复杂性上看起来非常相似(使用OR运算符搜索5个术语),我不明白为什么一个查询比另一个查询慢得多。

    任何见解都将不胜感激!

    当做 马里奥

    第一个查询(拼音):

    {
      "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
        }
      }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Mysterion    7 年前

    我想说很清楚这两者的区别是什么- rewrite 过程扩展项 mario 一个存在的同义词。这个过程基本上需要您通过SynonymGraphFilter进行处理,我相信它可以从磁盘读取关于同义词的数据,这会使速度变慢。

    在布尔查询的情况下,匹配将通过不同的分析器链(我认为这只是相同的语音,但没有同义词)

    推荐文章