2017-03-25 227 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进行搜索。