首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ElasticSearch网站搜索自动完成特征行为

ElasticSearch网站搜索自动完成特征行为
EN

Stack Overflow用户
提问于 2016-11-09 14:33:53
回答 2查看 106关注 0票数 0

我试图复制ElasticSearch网站上搜索功能的确切行为。

有人知道在哪里可以找到映射/设置的来源吗?查询是如何执行的?

主要需求:

  • 所有搜索都必须不区分大小写(让我们使用“小写”TokenFilter)。
  • 应该突出显示匹配的搜索查询(检查下面输出的粗体部分)。
  • 结果的顺序很重要,基本上应该首先返回匹配搜索查询的较少字符的“短语”,这样才能首先返回精确(或接近)匹配。

场景

假设我有以下数据集:

代码语言:javascript
复制
ID, NAME
1,  SoftwareRocks everytime 
10, The is nothing like home
8,  Opacc Software AG is good but software is even better 
2,  Opacc Software AG 
3,  Sage KHK Software AG 
4,  Software AG 
5,  bbv Software Services AG 
6,  Software AG2 
7,  Sof on the world

测试1

输入:sof

输出

  • 4,Software
  • 6,Sof软件AG2
  • 7,Sof on the world
  • 2,Opacc Software
  • 3、Sage KHK Software
  • 1,SoftwareRocks每次
  • 5、bbv Sof软件服务公司
  • 8,Opacc Software是好的,而sof软件更好。

测试2

输入:软

输出

  • 4,Software
  • 6,Sof软件AG2
  • 2,Opacc Software
  • 3、Sage KHK Software
  • 1,SoftwareRocks每次
  • 5、bbv Sof软件服务公司
  • 8,Opacc Software是好的,但是软件软件更好。

测试3

输入:软件

输出

  • 4,软件 AG
  • 6,软件 AG2
  • 2,Opacc 软件 AG
  • 3、Sage KHK 软件 AG
  • 1,SoftwareRocks每次
  • bbv 软件服务公司
  • 8,羊驼软件 AG是好的,但是软件更好

测试4

输入:软件ag

输出

  • 4,软件AG
  • 6,软件AG2
  • 2,Opacc 软件AG
  • 3、Sage KHK 软件AG
  • 8,Opacc 软件AG是好的,但是软件更好

Try 1

代码语言:javascript
复制
PUT /my_index
    {
        "settings": { 
            "analysis": {
                "filter": {
                    "autocomplete_filter": { 
                        "type":     "edge_ngram",
                        "min_gram": 1,
                        "max_gram": 20
                    }
                },
                "analyzer": {
                    "autocomplete": {
                        "type":      "custom",
                        "tokenizer": "standard",
                        "filter": [
                            "lowercase",
                            "autocomplete_filter" 
                        ]
                    }
                }
            }
        }
    }

PUT /my_index/_mapping/my_type
    {
    "type": {
        "properties": {
            "name": {
                "type":            "string",
                "analyzer":  "autocomplete", 
                "search_analyzer": "standard" 
            }
        }
    }

GET /my_index/my_type/_search
{
    "query": {
        "match": {
            "name": "software"
        }
    }
}

Try 2

代码语言:javascript
复制
{"query" : {"match_phrase_prefix": { "name": "Software ag" }}}

这是正确的返回,但重点似乎关闭。例如:

  • 4,软件AG
  • 6,软件AG2
  • 2,Opacc 软件AG
  • 3、Sage KHK 软件AG
  • 8,Opacc 软件AG是好的,但是软件更好

我所期望的是搜索词会受到高度重视。返回元素的顺序应该基于整个项的长度。

EN

回答 2

Stack Overflow用户

发布于 2016-11-09 18:02:03

尝试这个查询。这将高亮搜索结果。

代码语言:javascript
复制
{
    'query':{
        'filtered':{
            'query':{
                'match':{
                    '_all':{
                        'query':"soft",
                        'type':'phrase'
                        }
                    }
                }
            }
        },
    'highlight':{
        'pre_tags':'<em>',
        'post_tags':'</em>',
        'fields':{'*':{}}
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-11-09 18:35:48

好的,您的用例非常简单。“弹性网站上的自动完成”也是“自动完成”的直接用例,但它们具有多个字段结构的搜索数据集,以及来自该字段的匹配关键字也决定了搜索结果的相关性/顺序。

为了保持简单,我将使用ngram令牌器作为映射中的字符串,并执行简单的过滤搜索映射

代码语言:javascript
复制
{
    "analysis": {
        "analyzer": {           
            "autocomplete_analyzer": {
                "type": "custom",
                "tokenizer": "standard",
                "filter": ["standard", "lowercase", "asciifolding", "filter_ngram"]
            }
        },
        "filter": {
            "filter_stop": {
                "type": "stop",
                "stopwords": "_english_",
                "ignore_case": true
            },
            "filter_shingle": {
                "type": "shingle",
                "max_shingle_size": 2,
                "min_shingle_size": 2,
                "output_unigrams": true
            },
            "filter_snowball": {
                "type": "snowball",
                "language": "english"
            },
            "filter_stemmer": {
                "type": "porter_stem",
                "language": "English"
            },
            "filter_ngram": {
                "type": "nGram",
                "min_gram": 3,
                "max_gram": 15
            },
            "filter_edgengram": {
                "type": "edgeNGram",
                "min_gram": 2,
                "max_gram": 15
            },
            "filter_worddelimiter": {
                "type": "word_delimiter"
            }
        },
        "tokenizer": {
            "haystack_ngram_tokenizer": {
                "type": "nGram",
                "min_gram": 3,
                "max_gram": 15
            },
            "haystack_edgengram_tokenizer": {
                "type": "edgeNGram",
                "min_gram": 2,
                "max_gram": 15,
                "side": "front"
            }
        }
    }
}

这些映射还包括一些我在自动完成解决方案中使用的高级过滤器。

代码语言:javascript
复制
{
    "query": {
        "filtered": {
            "filter": {
                "term": {
                    "FIELD": "VALUE"
                }
            }
        }

    }
}

弹性示例不对输入的关键字执行拼写检查/模糊查询。

如果您也想添加fuzzy,那么您还可以查看上面的文档,根据您的用法和调优模糊性来构建一个模糊查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40509445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档