0

我正在使用 ElasticsearchHaystacksearchDjango希望搜索以下结构:

{   
    {
        "title": "book1",
        "category" : ["Cat_1", "Cat_2"],
        "key_values" :
        [
            {
                "key_name" : "key_1",
                "value" : "sample_value_1"
            },
            {
                "key_name" : "key_2",
                "value" : "sample_value_12"
            }
        ]
    },

    {
        "title": "book2",
        "category" : ["Cat_3", "Cat_2"],
        "key_values" :
        [
            {
                "key_name" : "key_1",
                "value" : "sample_value_1"
            },
            {
                "key_name" : "key_3",
                "value" : "sample_value_6"
            },
            {
                "key_name" : "key_4",
                "value" : "sample_value_5"
            }
        ]
    }
}

现在我已经使用 Haystack 建立了一个索引模型,它带有一个“文本”,将所有数据放在一起并运行全文搜索!在我看来,这不是一个完善的搜索,因为我没有使用我的数据集结构,因此这有点奇怪。
例如,如果对于一个对象,我有一个键值

{
  "key_name": "key_1",
  "value": "sample_value_1"
}

对于另一个我有的对象

{
  "key_name": "key_2",
  "value": "sample_value_1"
}

我们得到了一个像“Key_1 sample_value_1”这样的查询,我得到了一个完全混合的结果,这些对象在其字段中包含这些单词而不是使用它们的结构。

PS 我对 ElasticSearch 完全陌生,最好对搜索技术和挑战说新。我在网上搜索过,所以按钮没有找到任何令人满意的东西。请让我知道我对这些搜索引擎的想法和期望是否有问题,以及是否有重复的问题!如果有更好的方法来设计用于这种搜索的数据库

4

1 回答 1

1

阅读有关嵌套映射的 es 文档并执行以下操作:

"book_type" : {
    "properties" : {

        // title, cat mappings

        "key_values" : {
            "type" : "nested"
            "properties": {
                "key_name": {
                    "type": "string", "index": "not_analyzed"
                },
                "value": {
                    "type": "string"
                }
            }
        }
    }
}

然后使用嵌套查询进行查询

"nested" : {
    "path" : "key_values",
    "query" : {
        "bool" : {
            "must" : [
                {
                    "term" : {"key_values.key_name" : "key_1"}
                },
                {
                    "match" : {"key_values.value" : "sample_value_1"}
                }
            ]
        }
    }
}
于 2013-08-19T09:01:35.020 回答