2017-03-25 255 views
0

我想知道是否可以在一個查詢中嵌套Elasticsearch對象中的所有數組元素中搜索值?見我的情況下一:搜索嵌套彈性搜索對象中所有鍵的值

​​

然後我插入以下數據(通過PHP):

ElasticSearch數據庫,我在name列配置嵌套對象

$data1 = array(
    'descripotion' => 'Row 1', 
    'name' => [ 
     'en' => 'First name data', 
     'ru' => 'Первое имя', 
     'de' => 'Eins data', 
     'it' => 'something else', 
    ] 
); 

$data2 = array(
    'descripotion' => 'Row 2', 
    'name' => [ 
     'en' => 'Second name data', 
    ] 
); 

然後我使用POST方法通過PostmanChrome擴展:

POST http://localhost:9200/_search

身體是:

{ 
    "query":{ 
     "nested": { 
      "path": "name", 
      "query": { 
       "bool": { 
        "must": [ 
          { "match": { "name.en": "First" }} 
        ] 
       } 
      } 
     } 
    } 
} 

這是可以正常使用。在上面的查詢中 - 我正在根據English翻譯第name列查詢數據。

所以,如果我想使用Russian語言進行搜索,代碼就會一直跟着:

{ "match": { "name.ru": "First" }} 

現在,我想做的事 - 是在同一時間所有的翻譯查詢(可以有提供1到100種語言)。喜歡的東西:

{ "match": { "name.*": "First" }} 
  1. 的問題 - 這是可能的,用我目前的配置?如果沒有使用當前的配置,那麼如何?我知道,如果我將name列轉換回正常類型(而不是nested) - 那麼它變得可能,因爲所有翻譯都集中在一個單獨的string類型值中。但在那種情況下 - 我放棄了選擇性的可能性!我想都:) 最好,沒有數據重複

  2. 問題 - 如果我在同一時間搜索所有翻譯 - 是否可以優先考慮一種語言而不是另一種語言?因此,如果單詞data是5種語言 - 我想要包含English搜索結果的文檔 - 列表中的第一個。

回答

0

好吧,

經歷了無數的教程會後,我得出的結論是ElasticSearch不能Associative arrays工作。相反 - Multidimensional arrays將被使用。

下面是一個例子。之前:

$arr = array(
    'name' => [ 
     'en' => 'First name', 
     'ru' => 'Первое имя', 
    ] 
); 

轉換爲多維:

$arr = array(
    'name' => [ 
     [ 
      'lang' => 'en', 
      'value' => 'First name data' 
     ], 
     [ 
      'lang' => 'ru', 
      'value' => 'Первое имя' 
     ] 
    ] 
); 

現在,回到我的問題。結束ElasticSearch查詢看起來是這樣的:

{ 
    "query":{ 
     "nested": { 
      "path": "name", 
      "query": { 
       "bool": { 
        "should": [ 
          { "term": { "name.lang": "it" }} 
        ], 
        "must": [ 
          { "match": { "name.value": "first" }} 
        ] 

       } 
      } 
     } 
    } 
} 

答案:

  • 回答問題1 - 從查詢中刪除上述should部分。

  • 對問題2的回答 - 請保留should部分。在那裏設置首選語言代碼。

如果我們想通過具體的語言,然後should應設置爲must進行搜索。