全文搜索的字段优先级

时间:2013-08-29 15:32:40

标签: elasticsearch

我的情况是我的产品被描述为少数,并使用以下结构:

{
    "defaultDescription" : "Default Description",
    "i18nDescription" : {
        "pt" : "Descrição Padrão",
        "de" : "Standard-Beschreibung"
    }
}

现在我有以下要求:按照优先语言列表(3种语言)执行搜索。如果第一种语言不在i18nDescription中,则只使用第二种语言,如果不存在第二种语言,则仅使用第三种语言,否则使用defaultDescription

我的解决方案如下:

// suppose request comes with the following languages: en, de, pt
{
    "size":10,
    "fields" : ["defaultDescription", "i18nDescription.en^50", "i18nDescription.de^20", "i18nDescription.pt^10"],
    "query": {
        "multi_match" : { "query" : "default", "fields" : ["description","descriptions.fr-CA"] }
    }
}

但是这个解决方案只是按优先级语言对结果进行排序,我想做的事情如下:i18nDescription.en:search OR (i18nDescription.de:search AND _empty_:i18nDescription.en) OR (i18nDescription.pt:search AND _empty_:i18nDescription.en AND _empty_:i18nDescription.de) OR (description:search AND _empty_:i18nDescription.pt AND _empty_:i18nDescription.en AND _empty_:i18nDescription.de)

有没有办法表示这是一个ElasticSearch查询?

1 个答案:

答案 0 :(得分:2)

使用bool查询,我们可以达到预期的效果。

它基本上需要检查一个字段是否有文本而其他字段(更重要的)是空的,因此它只考虑最重要的当前字段。

查询类似于:

{
    "size":10,
    "query": {
        "bool" : {
            "should" : [ 
                {
                    "bool" : {
                        "must" : [
                            { "multi_match" : { "fields":["defaultDescription"], "query" : "default" } },
                            { "query_string" : { "query" : "+_missing_:i18nDescription.en +_missing_:i18nDescription.de +_missing_:i18nDescription.pt" } }
                        ]
                    }
                },
                {
                    "bool" : {
                        "must" : [
                            { "multi_match" : { "fields":["i18nDescription.pt"], "query" : "default" } },
                            { "query_string" : { "query" : "+_missing_:i18nDescription.en +_missing_:i18nDescription.de" } }
                        ]
                    }
                },
                {
                    "bool" : {
                        "must" : [
                            { "multi_match" : { "fields":["i18nDescription.de"], "query" : "default" } },
                            { "query_string" : { "query" : "+_missing_:i18nDescription.en" } }
                        ]
                    }
                },
                {
                    "bool" : {
                        "must" : [
                            { "multi_match" : { "fields":["i18nDescription.en"], "query" : "default" } }
                        ]
                    }
                } 
            ]
        }
    }
}