ElasticSearch5.x对Suggester API(文档)进行了一些(突破性的)更改。最显著的变化如下:
完成建议器是面向文档的
{
"my-index": {
"mappings": {
"users": {
"properties": {
"firstName": {
"type": "text"
},
"lastName": {
"type": "text"
},
"suggest": {
"type": "completion",
"analyzer": "simple"
}
}
}
}
}
}
{
"_index": "my-index",
"_type": "users",
"_id": "1",
"_source": {
"firstName": "John",
"lastName": "Doe",
"suggest": [
{
"input": [
"John",
"Doe"
]
}
]
}
},
{
"_index": "my-index",
"_type": "users",
"_id": "2",
"_source": {
"firstName": "John",
"lastName": "Smith",
"suggest": [
{
"input": [
"John",
"Smith"
]
}
]
}
}
和按本查询:
POST /my-index/_suggest?pretty
{
"my-suggest" : {
"text" : "joh",
"completion" : {
"field" : "suggest"
}
}
}
它产生以下结果:
{
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"my-suggest": [
{
"text": "joh",
"offset": 0,
"length": 3,
"options": [
{
"text": "John",
"_index": "my-index",
"_type": "users",
"_id": "1",
"_score": 1,
"_source": {
"firstName": "John",
"lastName": "Doe",
"suggest": [
{
"input": [
"John",
"Doe"
]
}
]
}
},
{
"text": "John",
"_index": "my-index",
"_type": "users",
"_id": "2",
"_score": 1,
"_source": {
"firstName": "John",
"lastName": "Smith",
"suggest": [
{
"input": [
"John",
"Smith"
]
}
]
}
}
]
}
]
}
简而言之,对于文本“joh”的补全建议,返回了两(2)个文档-John的文档和text
属性的值都相同。
{
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"my-suggest": [
{
"text": "joh",
"offset": 0,
"length": 3,
"options": [
"John"
]
}
]
}
为了克服第二点,仅仅索引单个单词是不够的,因为您还需要将所有单词映射到文档,以便适当地缩小自动完成的后续单词。这样,您实际上会遇到与查询原始索引相同的问题。因此,附加索引不再有意义。
正如注释中所暗示的,另一种不获取重复文档的方法是为firstname
字段创建一个子字段,其中包含该字段的ngrams。首先,定义映射,如下所示:
PUT my-index
{
"settings": {
"analysis": {
"analyzer": {
"completion_analyzer": {
"type": "custom",
"filter": [
"lowercase",
"completion_filter"
],
"tokenizer": "keyword"
}
},
"filter": {
"completion_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 24
}
}
}
},
"mappings": {
"users": {
"properties": {
"autocomplete": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
},
"completion": {
"type": "text",
"analyzer": "completion_analyzer",
"search_analyzer": "standard"
}
}
},
"firstName": {
"type": "text"
},
"lastName": {
"type": "text"
}
}
}
}
}
然后索引几个文档:
POST my-index/users/_bulk
{"index":{}}
{ "firstName": "John", "lastName": "Doe", "autocomplete": "John Doe"}
{"index":{}}
{ "firstName": "John", "lastName": "Deere", "autocomplete": "John Deere" }
{"index":{}}
{ "firstName": "Johnny", "lastName": "Cash", "autocomplete": "Johnny Cash" }
然后,您可以查询Joh
,并为John
获得一个结果,为Johnny
获得另一个结果
{
"size": 0,
"query": {
"term": {
"autocomplete.completion": "john d"
}
},
"aggs": {
"suggestions": {
"terms": {
"field": "autocomplete.raw"
}
}
}
}
{
"aggregations": {
"suggestions": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "John Doe",
"doc_count": 1
},
{
"key": "John Deere",
"doc_count": 1
}
]
}
}
}
ES 7.2引入了一个名为search_as_you_type
的新数据类型,它在本地允许这种行为。请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/7.2/search-as-you-type.html
<Ctrl+n> 下一个匹配项 <Ctrl+p> 上一个匹配项 您可以在配置文件中定义补全的方式 "自动补全方式:(使用逗号分隔) set complete=k,. " . 当前文件 " b 已被装缓冲区,但是没有在窗口内的文件 " d 在当前的文件中定义和由 #include 包含进来的文件 " i 由 #include 包含进来的文件 " k
在我的elasticsearch索引中,我索引了一堆工作。为了简单起见,我们只能说它们是一堆职位头衔。当人们在我的搜索引擎中输入一个职位头衔时,我想用可能的匹配“自动完成”。 我在这里调查了完成建议者:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.
问题内容: ElasticSearch 5.x对Suggider API(文档)进行了一些(重大)更改。最值得注意的变化如下: 完成建议器面向文档 建议知道它们所属的文档。现在,关联文档()作为完成建议的一部分返回。 简而言之,所有完成查询都返回所有匹配的 文档, 而不是匹配的 word 。这里存在一个问题-如果在多个文档中出现自动完成的单词,则重复它们。 假设我们有一个简单的映射: 带有一些测试
问题内容: 我已经使用IntelliJ已有一段时间了,但是总有一些困扰我的事情。它与自动完成功能有关。这个gif应该足以说明。 本质上,无论两个单词或上下文如何,当在另一个单词之间(中间没有空格)键入单词时,无论是关键字还是变量,自动完成功能都将用您完成的单词替换下一个单词。考虑到Eclipse,IntelliJ没有为此设置(至少不是我所知道的),令我感到惊讶。 提前致谢! 问题答案: 此行为取决
本文向大家介绍vue 简单自动补全的输入框的示例,包括了vue 简单自动补全的输入框的示例的使用技巧和注意事项,需要的朋友参考一下 实现一个输入框,输入信息后显示由后台返回的数据,供用户选择,之前用的elm的组件,不过那个有点大。。。简单的情况下自己实现一个也能满足要求。。。应该吧。。。 主题包括一个input用于输入,一个div用于展示数据,div里面是数据项item 当在input中按下回车时
智能自动补全会将不适用的条目过滤掉,只显示可用的类、变量、属性或者方法 操作步骤: 菜单栏:Code —> Completion —>SmartType 快捷键: Mac: control + Shift + 空格 Windows\/Linux: Ctrl + Shift + 空格