代码之家  ›  专栏  ›  技术社区  ›  Patrick

使用完整的suggester和德语分析器进行搜索

  •  1
  • Patrick  · 技术社区  · 6 年前

    我创建了一个带有建议字段和完成类型的简单索引。我索引了一些城市的名字。对于建议字段,我使用德国分析仪。

    PUT city_de
    {
      "mappings": {
        "city" : {
          "properties": {
            "name" : {
              "type": "text",
              "analyzer": "german"
            },
            "suggest" : {
              "type": "completion",
              "analyzer": "german"
            }
          }
        }
      }
    }
    

    分析器工作正常,使用umlauts进行搜索效果良好。自动完成也很完美。但我在寻找这个词时遇到了一个问题 wie .

    假设我有两份文件 Wiesbaden Wien 与建议完成期限同名。

    如果我搜索 wie公司 我想这些城市 维也纳 威斯巴登 都在回应中。但不幸的是,我没有得到任何回应。我想 wie公司 由于德国分析仪的限制。因为如果我搜索 wi wies 我得到了有效的回答。

    学期也一样 was , er , sie , und 这看起来像是德语中的词干。

    如果搜索,是否还需要任何其他配置才能获得结果 wie公司 ?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   Andreas Neumann    6 年前

    问题所在

    按前缀搜索城市名称

    “wie”应找到“Wien”或“Wiesbaden”

    可能的解决方法

    对于用例,我建议使用 edge n-gram https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html ASCII folding 条款 https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-asciifolding-tokenfilter.html .

    实例

    wien
    token   position    start offset    end offset
    w   0   0   1
    wi  1   0   2
    wie 2   0   3
    wien    3   0   4
    
    
    
    wiesbaden
    token   position    start offset    end offset
    w   0   0   1
    wi  1   0   2
    wie 2   0   3
    wies    3   0   4
    ...
    wiesbaden   8   0   9
    

    请记住,系统现在必须以不对称的方式工作。不应分析查询(使用关键字),但必须分析索引中的数据。

    有两种方法可以实现这一点: 1.)添加查询分析器以使用查询 2)将查询分析器绑定到字段

    "cities": {
            "type": "text",
            "fields": {
              "autocomplete": {
                "type": "text",
                "analyzer": "autocomplete_analyzer", <-- index time analyzer
                "search_analyzer": "autocomplete_search" <-- search time analyzer
              }
            }
          }
    

    为什么德国分析仪不工作

    该分析器是为德语文本设计的,使用一种简单的算法来消除弯曲和形态学。 https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#german-analyzer 下面是此标记器生成的典型术语的示例

    Hallo hier ist der Text über Wiesbaden und Wien. Es scheint angebracht über Wände und Wandern zu sprechen. 
    
    hallo   0   0   5
    text    4   19  23
    wiesbad 6   29  38
    wien    8   43  47
    scheint 10  52  59
    angebracht  11  60  70
    wand    13  76  81
    wandern 15  86  93
    sprech
    

    如果它适用于城市名称,这只是巧合。