在弹性搜索中,我将记录存储在trends
命名空间和trend
主题中。这些是简单的对象,只有name
(字符串)和id
。
我想通过自动填充按名称搜索,为此我正在尝试使用索引搜索。
这是我将代码添加到name列的代码。在这里,我使用name_suggest
列插入相同数据作为name
列,并在查询中使用。
def self.index_column_mappings
elasticsearch.index({
index: "trends",
type: "trend",
body: {
mappings: {
trend: {
properties: {
name: {
type: "string"
},
name_suggest: {
type: "completion"
}
}
}
}
}
})
end
从我DELETE *
开始。然后我添加此列映射并添加一些记录。接下来我运行它来搜索:
def suggest(term)
@client.search({
index: "trends",
type: "trend",
body: {
suggest: {
name_suggest: {
prefix: term,
completion: {
field: "name_suggest"
}
}
}
}
})
end
我收到以下错误:
Elasticsearch :: Transport :: Transport :: Errors :: BadRequest:[400] {“error”:{“root_cause”:[{“type”:“illegal_argument_exception”,“reason”:“Field [name_suggest] is不是完成建议字段“}],”类型“:”search_phase_execution_exception“,”reason“:”所有分片失败“,”阶段“:”查询“,”分组“:true,”failed_shards“:[{”shard“ :0,“index”:“trends”,“node”:“YVcINtPlSU2u8R2lT9VxPQ”,“reason”:{“type”:“illegal_argument_exception”,“reason”:“Field [name_suggest]不是完成建议字段”}} ],“caused_by”:{“type”:“illegal_argument_exception”,“reason”:“Field [name_suggest]不是完成建议字段”}},“status”:400} 来自/home/max/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/elasticsearch-transport-5.0.3/lib/elasticsearch/transport/transport/base.rb:201:in `__raise_transport_error'
似乎重要的部分是:字段[name_suggest]不是完成建议字段。我不明白我是如何设置该字段的。
顺便说一下,我正在使用弹性搜索5.x
回复此处的评论是GET /trends/_mapping
的结果:
{
"trends": {
"mappings": {
"trend": {
"properties": {
"id": {
"type": "long"
},
"mappings": {
"properties": {
"trend": {
"properties": {
"properties": {
"properties": {
"name": {
"properties": {
"type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"name_suggest": {
"properties": {
"type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
}
}
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"name_suggest": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
答案 0 :(得分:1)
最后答案。 您使用错误的方法来索引数据。寻找example here
def self.index_column_mappings
client.indices.create({
index: "trends",
body: {
mappings: {
trend: {
properties: {
name: { type: 'string' },
name_suggest: { type: 'completion' }
}
}
}
}
})
end