1

私の製品がいくつかに記載されており、次の構造が使用されている状況があります。

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

ここで、次の要件があります: 優先順位付けされた言語 (3 言語) のリストに従って検索を実行します。最初の言語が にないi18nDescription場合は 2 番目の言語のみを使用し、2 番目の言語がない場合は 3 番目の言語のみを使用します。それ以外の場合は と一致し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 クエリであることを表す方法はありますか?

4

1 に答える 1

2

bool クエリを少しいじると、目的の効果が得られました。

基本的に、1 つのフィールドにテキストがあり、他の (より重要な) フィールドが空であるかどうかを確認する必要があるため、最も重要な現在のフィールドのみを考慮します。

クエリは次のようになります。

{
    "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" } }
                        ]
                    }
                } 
            ]
        }
    }
}
于 2013-08-29T17:34:18.233 に答える