使用Elasticsearch自动完成

时间:2015-03-25 09:17:03

标签: symfony autocomplete elasticsearch foselasticabundle

我正在尝试使用Elasticsearch索引城市数据库并在字段上获得自动填充功能。

这是我的FOSElasticaBundle配置:

fos_elastica:
    indexes:
        xxxxxxx:
            settings:
                index:
                    analysis:
                        analyzer:
                            custom_analyzer:
                                type:      custom
                                tokenizer: nGram
                                filter:    [lowercase, asciifolding, stopwords_fr, elision, snowball_fr, word_delimiter]
                            custom_search_analyzer:
                                type:      custom
                                tokenizer: standard
                                filter:    [lowercase, asciifolding, stopwords_fr, elision, snowball_fr, word_delimiter]
                        tokenizer:
                            nGram:
                              type:     nGram
                              min_gram: 4
                              max_gram: 20
                        filter:
                            snowball_fr:
                                type:     snowball
                                language: French
                            elision:
                                type:     elision
                                articles: [l, m, t, qu, n, s, j, d]
                            stopwords_fr:
                                type:        stop
                                stopwords:   [_french_]
                                ignore_case: true
            types:
                cities:
                    mappings:
                        id:
                        name: { search_analyzer: custom_analyzer, index_analyzer: custom_analyzer, type: string, store: yes }
                persistence:
                    driver:     orm
                    model:      XXXXX\MainBundle\Entity\City
                    provider:   { query_builder_method: createSearchIndexQueryBuilder }
                    listener:   ~
                    finder:     ~
                    repository: XXXXX\SearchBundle\Repository\CitySearchRepository

我的查询如下:

{
  "query": {
    "match": {
      "name": "xxxxxx"
    }
  }
}

但我的问题在这里:

  • 当我输入“Pa”时,我会 242 结果(ok)
  • 当我输入“Par”时,我无结果(WTF)
  • 当我输入“Pari”时,我得到 22 结果(ok)
  • 当我输入“Paris”时,我会 10 结果(ok)

这是我第一次使用Elasticsearch,我认为解决方案就在附近,但如果有人遇到同样的问题,我很想知道更多。

谢谢,祝你有个美好的一天;)

1 个答案:

答案 0 :(得分:0)

在您的查询中,您正在进行匹配。这意味着您将查找具有您正在寻找的(已分析)值的文档。

您应该查看completion suggester,这是实施自动填充建议的最佳方式。

如果你很懒,你可以使用prefix query

{
    "prefix" : { "user" : "Pa" }
}