【问题标题】:Elasticsearch full-text query issue from inner array来自内部数组的 Elasticsearch 全文查询问题
【发布时间】:2015-11-24 11:39:30
【问题描述】:

这是我的目标。我想在任务中找到文本,即 task.name.

{
  "_id" : ObjectId("55e2acd77e5e4ddc037b3ef5"),
  "userId" : "123",
  "username" : "user12",
  "address" : "abc",
  "number" : 928228828282.0,
  "task" : [{
      "name" : "metac",
      "productCode" : "1234",
      "_id" : ObjectId("55e2acd77e5e4ddc037b3ef7")
    }, {
      "name" : "alfa33",
      "productCode" : "1234",
      "_id" : ObjectId("55e2acd77e5e4ddc037b3ef6")
    }],
  "__v" : 0
}

所以当我查询它时,它将返回所有任务。

curl -XPOST 'localhost:9200/userprofiles/_search?pretty' -d '
{
  "query": { "match": { "name": "alfa33" } }
}

输出:

{
    "took": 51,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.19178301,
        "hits": [
            {
                "_index": "userprofiles",
                "_type": "userprofile",
                "_id": "55e2acd77e5e4ddc037b3ef5",
                "_score": 0.19178301,
                "_source": {
                    "userId": "123",
                    "username": "user12",
                    "address": "abc",
                    "number": 928228828282,
                    "task": [
                        {
                            "name": "metac"
                        },
                        {
                            "name": "alfa33"
                        }
                    ]
                }
            }
        ]
    }
}

如您所见,任务返回完整数组,我只需要选择 1 个任务。

我在节点内部使用 mongoosastic,它会给我带来问题,所以我尝试直接使用请求到 Elasticsearch。

mongoosastic 配置 - >elasticsearch search text return full array issue 我尝试了这个解决方案,但不起作用。

目前我在 git bush 中使用 curl 命令搜索我的结果,而不是使用搜索功能

编辑

文件:- 猫鼬和猫鼬。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var medicineSchema = require('./search')
var mongoosastic = require("mongoosastic");

var UserProfileSchema = new Schema({
    userId: String,
    username: String,
    address: String,
    number: Number,
    task: [{
        name: {
            type: String,
            es_boost: 2.0 // or es_indexed:true
        },
        taskCode: String,
    }]
});
UserProfileSchema.plugin(mongoosastic);
UserProfileSchema.plugin(mongoosastic, {
    host: "localhost",
    port: 9200,
    //  ,curlDebug: true
});
UserProfile = module.exports = mongoose.model('UserProfile', UserProfileSchema);
UserProfile.createMapping(function(err, mapping) {
    if (err) {
        console.log('error creating mapping (you can safely ignore this)');
        console.log(err);
    } else {
        console.log('mapping created!');
        console.log(mapping);
    }
});

还有我的搜索查询:

var UserProfileSchema = require('../../app/models/user');
 UserProfileSchema.search({
        query_string: {
            query: name
        }
    }, function(err, result) {
        if (err) {
            callback({
                RESULT_CODE: '-1',
                MESSAGE: 'System error'
            });
        } else {
            callback({
                RESULT_CODE: '1',
                DATA: result
            });
        }
    });

【问题讨论】:

  • 请至少添加您用来检索它的代码
  • @Michelem 我给出了我有问题的代码的链接,然后我再次更新了我的问题
  • @Michelem 我正在创建默认映射,正如您在代码中看到的那样
  • 我认为这个查询是正确的,看"hits": { "total": 1, ...},这意味着它找到了有任务的用户,但用户还有其他任务,查询返回的用户,而不是任务本身,如果你只想得到任务,然后为任务 API 制作处理程序,目前您正在点击 localhost:9200/userprofiles/_search?pretty,例如为 localhost:9200/tasks/_search?pretty 制作 API
  • @evc 哦,是的,你是对的。

标签: node.js elasticsearch full-text-search mongoosastic


【解决方案1】:

为了将它们视为单独的对象,您需要使用嵌套类型 对于“任务”字段,请按如下方式设置映射:

{
    "mappings": {
        "doc": {
            "... all the other fields ...": {},
            "task": {
                "properties": {
                    "_id": {
                        "type": "string"
                    },
                    "name": {
                        "type": "string"
                    },
                    "productCode": {
                        "type": "string"
                    }
                },
                "type": "nested"
            }
        }
    }
}

重新索引您的文档后。您需要将嵌套查询与 内部命中查询以返回与查询匹配的任务:

{
  "query": {
    "nested": {
      "path": "task",
      "query": {
        "match": {
          "name": "alfa33"
        }
      },
      "inner_hits": {}
    }
  }
}

inner_hits 部分将返回与查询匹配的特定任务 自己。

我已经发布了一个示例 full output here 因为它是一个 有点长,在这里完整发布。

【讨论】:

  • 我会试试这个例子。如果我遇到任何问题,请告诉您。
  • ...所有其他字段...表示我的父对象对吗?
  • 其他字段,如userId、用户名、地址等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
相关资源
最近更新 更多