我正在尝试为在MongoDB上运行的数据库构建自动完成功能。我们需要提供自动填充功能,以便用户在搜索框中输入内容时提供建议,从而完成查询。
我有来自不同来源的articles
集合,其中包含以下字段:
{
"title" : "Its the title of a random article",
"cont" : { "paragraphs" : [ .... ] },
and so on..
}
我经历了video by Clinton Gormley。从37:00到42:00,Gormley使用edgeNGram
描述了自动填充。另外,我提到this question认识到两者几乎是相同的东西,只是映射不同。
基于这些经验,我构建了几乎相同的设置和映射,然后恢复了articles
集合以确保它被ElasticSearch索引
索引方案如下:
POST /title_autocomplete/title
{
"settings": {
"analysis": {
"filter": {
"autocomplete": {
"type": "edgeNGram",
"min_gram": 2,
"max_gram": 50
}
},
"analyzer": {
"title" : {
"type" : "standard",
"stopwords":[]
},
"autocomplete": {
"type" : "autocomplete",
"tokenizer": "standard",
"filter": ["lowercase", "autocomplete"]
}
}
}
},
"mappings": {
"title": {
"type": "multi_field",
"fields" : {
"title" : {
"type": "string",
"analyzer": "title"
},
"autocomplete" : {
"type": "string",
"index_analyzer": "autocomplete",
"search_analyzer" : "title"
}
}
}
}
}
但是当我运行搜索查询时,我无法获得任何点击!
GET /title_autocomplete/title/_search
{
"query": {
"bool" : {
"must" : {
"match" : {
"title.autocomplete" : "Its the titl"
}
},
"should" : {
"match" : {
"title" : "Its the titl"
}
}
}
}
}
有人可以解释映射查询或设置有什么问题吗?我现在已经阅读ElasticSearch文档超过7天了,但似乎无法获得全文搜索!
更新 我意识到在应用先前的设置后,映射被搞砸了:
GET /title_autocomplete/_mapping
{
"title_autocomplete": {
"title": {
"properties": {
"analysis": {
"properties": {
"analyzer": {
"properties": {
"autocomplete": {
"properties": {
"filter": {
"type": "string"
},
"tokenizer": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"title": {
"properties": {
"type": {
"type": "string"
}
}
}
}
},
"filter": {
"properties": {
"autocomplete": {
"properties": {
"max_gram": {
"type": "long"
},
"min_gram": {
"type": "long"
},
"type": {
"type": "string"
}
}
}
}
}
}
},
"content": {
... paras and all ...
}
"title": {
"type": "string"
},
"url": {
"type": "string"
}
}
}
}
}
分析器和过滤器实际上在应用设置后映射到文档中,而原始title
字段完全不受影响!这是正常的??
我想这解释了为什么查询不匹配。根本没有title.autocomplete
字段或title.title
字段。
那我该怎么办呢?
答案 0 :(得分:0)
对于遇到此问题的人,最好删除索引并重新开始,而不是像_river一样浪费时间{/ 3}}。
这节省了时间,但不是解决方案。 (因此不将其标记为答案。)
答案 1 :(得分:0)
关键是在启动河流之前设置映射和索引。
我们有一个mongodb河的现有设置和一个名为coresearch的索引,我们想要添加自动完成容量,这是我们用来删除现有索引和河流并重新开始的命令集。
Stack is:
Ubuntu 12.04.2 LTS
curl -XDELETE“localhost:9200 / _river / node” curl -XDELETE“localhost:9200 / coresearch”
curl -XPUT“localhost:9200 / coresearch”-d' { “设置”:{ “分析”:{ “过滤器”:{ “autocomplete_filter”:{ “type”:“edge_ngram”, “min_gram”:1, “max_gram”:20 } }, “analyzer”:{ “autocomplete”:{ “type”:“custom”, “tokenizer”:“标准”, “过滤器”:[ “小写”, “autocomplete_filter” ] } } } } }“
curl -XPUT“localhost:9200 / coresearch / _mapping / users”-d'{ “用户”:{ “properties”:{ “名字”: { “type”:“string”, “search_analyzer”:“标准”, “index_analyzer”:“自动完成” }, “姓”: { “type”:“string”, “search_analyzer”:“标准”, “index_analyzer”:“自动完成” }, “用户名”: { “type”:“string”, “search_analyzer”:“标准”, “index_analyzer”:“自动完成” }, “电子邮件”:{ “type”:“string”, “search_analyzer”:“标准”, “index_analyzer”:“自动完成” } } } }“
curl -XPUT“localhost:9200 / _river / node / _meta”-d' { “type”:“mongodb”, “mongodb”:{ “服务器”:[ {“host”:“127.0.0.1”,“port”:27017} ] “选择”:{ “exclude_fields”:[“time”] },
"db": "users",
"gridfs": false,
"options": {
"import_all_collections": true
}
},
"index": {
"name": "coresearch",
"type": "documents"
}
}“