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

Search with complete suggester and german analyzer

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

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

分析器工作正常,使用变音符号进行搜索也很好。自动完成也很完美。但是我在搜索术语 wie 时遇到了问题。

假设我有两个文档 WiesbadenWien 与建议完成术语同名。

如果我搜索 wie,我假设城市 WienWiesbaden 在响应中。但不幸的是我没有得到回应。我想 wie 由于德语分析器而受到限制。因为如果我搜索 wiwies,我会得到有效的回复。

术语 wasersieund 也是如此,看起来像德语中的词干词。

如果我搜索 wiewas,是否需要任何其他配置才能获得结果?

谢谢!

问题

正在按前缀搜索城市名称

"wie" 应该找到 "Wien" 或 "Wiesbaden"

可能的解决方法

对于用例,我建议使用 edge n-gram https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html and ASCII folding the terms 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

如果它适用于城市名称,这纯属巧合。