ElasticSearch自动完成返回0次点击

时间:2014-01-26 18:03:05

标签: mongodb autocomplete elasticsearch elasticsearch-mongo-river

我正在尝试为在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天了,但似乎无法获得全文搜索!

  • ElastiSearch版本:0.90.10
  • MongoDB版本:v2.4.9
  • 使用_river
  • Ubuntu 12.04 64bit

更新 我意识到在应用先前的设置后,映射被搞砸了:

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字段。

那我该怎么办呢?

2 个答案:

答案 0 :(得分:0)

对于遇到此问题的人,最好删除索引并重新开始,而不是像_river一样浪费时间{/ 3}}。

这节省了时间,但不是解决方案。 (因此不将其标记为答案。)

答案 1 :(得分:0)

关键是在启动河流之前设置映射和索引。

我们有一个mongodb河的现有设置和一个名为coresearch的索引,我们想要添加自动完成容量,这是我们用来删除现有索引和河流并重新开始的命令集。

Stack is:

  • ElasticSearch 1.1.1
  • MongoDB 2.4.9
  • ElasticSearchMapperAttachments v2.0.0
  • ElasticSearchRiverMongoDb / 2.0.0
  • 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"
    }
    

    }“