【问题标题】:Twitter like search for users using Elasticsearch and pythonTwitter 喜欢使用 Elasticsearch 和 python 搜索用户
【发布时间】:2014-11-23 20:33:51
【问题描述】:

我正在尝试使用 elasticsearch 和 python 为用户构建一个类似 twitter 的搜索。那是对first_name, last_name and username. 的搜索,我决定使用 ngram。这是分析器的配置方式:

 settings = {
    "analysis": {
        "analyzer": {
            "ngram_analyzer": {
                "type": "custom",
                "tokenizer": "standard",
                "filter": [
                    "lowercase",
                    "asciifolding",
                    "mynGram"
                ]
            }
        },
        "filter": {
            "mynGram": {
                "type": "nGram",
                "min_gram": 2,
                "max_gram": 20
            }
        }
    }
}

这将为大约 700,000 个文档生成 700 MB 的索引大小。这涵盖了我的大部分用例,但有一个:

  1. John - 给出一组结果
  2. John D - 给出与 'John' 相同的结果集
  3. John Do - 给出正确的结果集。

我的猜测是因为 min. ngram 大小为 2,它会在上面的查询 2 中创建一个盲点。我可以选择减少最小值。 ngram 大小为 1,但我担心可伸缩性和性能问题。

考虑到可扩展性和性能,ngram 是正确的方法吗?

【问题讨论】:

    标签: search elasticsearch n-gram


    【解决方案1】:

    问题可能出在您的映射定义中。使用 ngram 分析器,您希望 index_analyzerngram_analyzer,但 不是 search_analyzer

    否则,您的查询字符串本身将被拆分为 ngram。 John 变为 Joohhn 等,termmatch 过滤器将匹配任何这些令牌。

    文档:Index time search-as-you-type

    在相关说明中,如果您打算只进行前缀搜索,edge-ngram tokenizer 会更合适,并且会使用更少的内存(RAM 和磁盘)。

    【讨论】:

    • 不,我在搜索过程中使用标准分析器。
    • 嗯,你能发布你的映射定义吗?
    猜你喜欢
    • 2015-09-19
    • 2017-01-11
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多