搜索引擎 [求助] ElasticSearch 无法搜索

Loyea · 2018年01月09日 · 最后由 easonlovewan 回复于 2018年01月09日 · 6171 次阅读

问题已解决,看 5 楼

最近要给项目搜索添加分词功能,然后上了 ES,使用 ik 插件。本地试了 ik 插件 readme 的 demo,也试过网上其他 demo,都能顺利导入索引并分词搜索。但是自己的项目导入索引成功,但是搜索怎么都 0 命中。

我看了 ik 的官网 readme 中的 demo,我 get 单个数据返回的是这样的

get 请求: curl -XGET http://localhost:9200/index/fulltext/1

get 返回:

{"_index":"index","_type":"fulltext","_id":"1","_version":1,"found":true,"_source":
{"content":"美国留给伊拉克的是个烂摊子吗"}
}

然后我试了下自己的项目,返回是这样的:

{
  "_index" : "app",
  "_type" : "food",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "food" : {
      "appraise" : "小麦富含淀粉、蛋白质、脂肪、矿物质、钙、铁、硫胺素、核黄素、烟酸、维生素A及维生素C等,是主要的主食来源,适宜减肥期间食用。"
    }
  }
}

试了下别的 demo,在 Rails Console 里面调用 Model.first.as_indexed_json 返回的一般是这样的:

{"content":"美国留给伊拉克的是个烂摊子吗"}

但是我这个项目返回时这样的:

{"food"=>{"appraise"=>"小麦富含淀粉、蛋白质、脂肪、矿物质、钙、铁、硫胺素、核黄素、烟酸、维生素A及维生素C等,是主要的主食来源,适宜减肥期间食用。"}} 

不知道为什么外面还有层food。。。。尝试手动向 ES 加入一个没有 food 的索引能够搜索成功

在我的 Food Model 里面 as_indexed_json 方法是这样的:

def as_indexed_json(options = nil)
    as_json(
        only: [:appraise]
    )
  end

跟别的 demo 也一样,但是结果不知道为什么会多一个 Food 出来

没用过 ik... 不用在 mapping 里指定 analyzer 吗?

据说现在都不用分词了, 用 ngram 搜索, 靠打分排序更好...

要不 你贴下代码或者代码库

  1. 这个和 ik 分词插件无关
  2. 从 API 请求是直接请求到 ES,你的项目应该是通过 gem 这一层去请求 ES(你没有说明你用的哪个 gem)
  3. 直觉感觉你的问题应该在 mapping 的定义上

确定一下你的 model 里面 appraise 索引使用分词了没,正常应该是这样的

mapping dynamic: false do
    indexes :appraise, analyzer: 'xxx'
end
easonlovewan 回复

有的 不过我发现这个并不影响 as_indexed_json 的输出结果


最后看了下 elasticsearch-rails 的 wiki,发现了另外一种写as_indexed_json的方式,算是解决了这个问题

def as_indexed_json(options={})
    {
        "appraise" => appraise
    }
  end

就是手动指定输出的字段

@Loyea 应该也不是这个问题,因为我看你之前的 model 里面自定义 json 输出字段是没有问题的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号