尝试在我的RoR应用程序中使用ElasticSearch more_like_this查询。我为不同的环境设置了不同的索引,相应地有search_development和search_staging。
在暂存环境中执行MLT查询时(通过CURL或通过Rails控制台)一切似乎都很好 - 返回记录。
在开发环境中执行相同操作时,结果集始终为空。我认为这与数据版本有关,所以我尝试从头开始重新创建索引。现在我已经这样做了,查询MLT会引发异常:
Elasticsearch::Transport::Transport::Errors::BadRequest: [400] {"error":"SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[UvOf1vxTR6WNICxTzIdJ1g][search_development][2]: SearchParseException[[search_development][2]: from[-1],size[-1]: Parse Failure [Failed to parse source [{\"query\":{\"more_like_this\":{\"ids\":[\"1\"],\"fields\":[\"title\",\"description\"]}}}]]]; nested: QueryParsingException[[search_development] ambiguous type for item with id: 1 and index: search_development]; }
通过CURL和Rails控制台都会发生这种情况。完全相同的查询在登台索引上工作正常。检查时,记录在索引中,数据也在那里。 query_string查询工作正常,就像以前一样。
对于弹性搜索或MLT查询的多索引部分,我显然遗漏了一些东西,因为在重新创建索引之前,查询没有返回结果(同样的查询工作完全相同)对分期索引很好)。我必须补充说,登台索引有超过一千条记录,而开发只有14条。
查询是:
curl -XGET 'http://asdf:9200/search_development/_search' -d '{ "query": {"more_like_this": {"ids": ["1"], "fields": ["title","description"]}} }'
答案 0 :(得分:2)
两个潜在问题:
curl -XGET 'http://asdf:9200/search_development/my_type/_search' -d '{ "query": {"more_like_this": {"ids": ["1"], "fields": ["title","description"]}} }'
docs:
查询detailed here使用more_like_this
语法。这类似于multi-get API。 docs
语法允许您为要分析的每个文档指定index:
和type:
,从而避免了Elasticsearch的歧义。 curl -XGET 'http://asdf:9200/search_development/_search' -d '{ "query": {"more_like_this": {"fields": ["title","description"], "docs": [{"_index": "search_development", "_type": "my_type", "_id": "1" }}}'
警告我还没有真正做到这一点,所以我不确定,但我怀疑这会解决问题。