search - ElasticSearch自动完成

标签 search lucene elasticsearch

我有四个文档,其字段名为“全名”。

文件:

  • 阿比盖尔·哈里森
  • Abigale Hardison
  • 阿比林·哈弗顿
  • Abilene-Havington

  • 我想为此 Realm 做一个自动完成器。一些例子:

    搜索:“Abi”
    结果:“Abigail Harrison”,“Abigale Hardison”,“Abilene Haveton”

    搜索:“Abig”
    结果:“Abigail Harrison”,“Abigale Hardison”

    搜索:“Abigail Har”
    结果:“Abigail Harrison”,“Abigale Hardison”

    搜索:“Abilene Hav”
    结果:“Abilene Haveton”,“Abilene-Havington”

    搜索:“Har”
    结果:“Abigail Harrison”,“Abigale Hardison”

    我不要这样的东西:(!)

    搜索:“iga”
    结果:“Abigail Harrison”,“Abigale Hardison”

    空格和连字符应被忽略,并且我希望所有生成的标记都小写,因此搜索查询不应区分大小写。

    我的ES设置如下。
    {
    "mappings": {
        "person": {
            "properties": {
                "fullname": {
                    "index": "analyzed",
                    "index_analyzer": "autocomplete",
                    "search_analyzer": "standard",
                    "type": "string"
                }
            }
        }
    },
    "settings": {
        "index": {
            "analysis": {
                "analyzer": {
                    "autocomplete": {
                        "filter": [
                            "lowercase",
                            "edgengram"
                        ],
                        "tokenizer": "whitespace"
                    }
                },
                "filter": {
                    "edgengram": {
                        "max_gram": 50,
                        "min_gram": 3,
                        "type": "edgeNGram"
                    }
                }
            }
        }
    }
    

    }

    最佳答案

    编制索引时,您应该使用标准的分词器以及小写字母,ASCII折叠,suggestation_shingle,edgengram和在搜索时使用关键字分析器。

    尝试使用如下所示的内容:

    "index":{
    "analysis": {
        "analyzer": {
            "autocomplete": {
                "tokenizer": "standard",
                "filter": [
                    "lowercase",
                    "asciifolding",
                    "suggestions_shingle",
                    "edgengram"
                ]
            }
        },
        "filter": {
            "suggestions_shingle": {
                "type": "shingle",
                "min_shingle_size": 2,
                "max_shingle_size": 5
            },
            "edgengram": {
                "type": "edgeNGram",
                "min_gram": 2,
                "max_gram": 30,
                "side": "front"
            }
        }
    }
    }
    
    "mappings": {
        "person": {
            "properties": {
                "fullname": {
                    "index": "analyzed",
                    "index_analyzer": "autocomplete",
                    "search_analyzer": "keyword",
                    "type": "string"
                }
            }
        }
    }
    

    然后尝试使用匹配查询进行搜索。它应该可以解决您的问题。

    谢谢

    关于search - ElasticSearch自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24882196/

    相关文章:

    javascript - 如何在输入搜索框清除时隐藏搜索结果?请只使用 JavaScript

    lucene - 使用文档存储作为缓存

    date - 使用 Lucene.Net 在两个日期之间搜索

    c - 在 txt 中使用 strstr() 找到一个字符串

    Javascript用其他文本替换字符串中的文本

    java - 为什么ElasticSearch重启后不可用,部分分片未分配?

    elasticsearch - 为什么添加日期范围过滤器会禁用aggs?

    php - 弹性JSON查询到PHP关联数组和空对象

    php - 当字段为空时返回所有结果

    elasticsearch - 从自定义FieldBridge索引LongField问题