2016-03-07 140 views
0

在具有相同名稱的字段上搜索相同的值。我想返回下面的文檔只有當所有的值是場「list.perInd」是「IXSO」 ..... 原始文件看起來像這樣ElasticSearch在具有相同名稱的列表字段上搜索相同的值

 { 
      "pkClmn": 676101388023, 
      "dutyCde": "RICE", 
      "list": [ 
       { 
       "pkClmn": 67610138804, 
       "perInd": "IXSO", 
       }, 
       { 
       "pkClmn": 67610138803, 
       "perInd": "IXSO", 
       }, 
       { 
       "pkClmn": 67610138802, 
       "perInd": "IASI", 
       }, 
       { 
       "pkClmn": 67610138801, 
       "perInd": "IASI", 
       } 
      ] 
     } 

返回文檔只有list.perInd擁有所有4 IXSO ...

+1

你能否爲你的問題添加更多解釋? – Richa

+0

那麼我刪除了我的答案,因爲我認爲我弄錯了,你能解釋你想要搜索什麼以及應該返回什麼嗎? –

+0

還是你的意思是你想要返回的文件只有當list.perInd有所有4個IXSO? –

回答

0

目前的解決方案可能有一些性能問題,但它的工作原理,你應該測試它

POST stack/type1/1 
{ 
    "pkClmn": 676101388023, 
    "dutyCde": "RICE", 
    "list": [ 
    { 
     "pkClmn": 67610138804, 
     "perInd": "IXSO" 
    }, 
    { 
     "pkClmn": 67610138803, 
     "perInd": "IXSO" 
    }, 
    { 
     "pkClmn": 67610138802, 
     "perInd": "IASI" 
    }, 
    { 
     "pkClmn": 67610138801, 
     "perInd": "IASI" 
    } 
    ] 
} 


POST stack/type1/2 
{ 
    "pkClmn": 676101388023, 
    "dutyCde": "RICE", 
    "list": [ 
    { 
     "pkClmn": 67610138804, 
     "perInd": "IXSO" 
    }, 
    { 
     "pkClmn": 67610138803, 
     "perInd": "IXSO" 
    }, 
    { 
     "pkClmn": 67610138802, 
     "perInd": "IXSO" 
    }, 
    { 
     "pkClmn": 67610138801, 
     "perInd": "IXSO" 
    } 
    ] 
} 


POST stack/type1/_search 
{ 
    "query": { 
    "filtered": { 
     "query": { 
     "term": { 
      "list.perInd": { 
      "value": "ixso" 
      } 
     } 
     }, 
     "filter": { 
     "script": { 
      "script": "doc['list.perInd'].value == value", 
      "params": { 
      value: "ixso" 
      } 
     } 
     } 
    } 
    } 
} 

讓我解釋一下爲什麼它的工作。 Elasticsearch使用倒排索引來存儲數據。 Inverted index

所以,當你的索引文檔文本標記化(同樣有許多斷詞可以是單詞,可幾句話。閱讀Elasticsearch標記生成器),在標準的令牌是一個字。因此,在倒排索引中存在術語和參考我們示例中的文檔,它需要ixsoiasi並將它們寫入倒排索引。所以,如果你有兩個術語,那麼doc [fieldname] .values將包含這兩個術語的數組,在我的情況下,我正在檢查.value屬性,因爲它將轉換爲字符串,並且如果有兩個標記字符串將與參數不同。

還有analyzed and not_analyzed映射。在我的例子中,我展示了分析結果,它只能用於一個術語perInd。例如,如果您將索引「測試字」,我的解決方案將不起作用,因爲doc ['list.perInd']。值將返回[「ixso」,「test」]。如果你使用多個詞,你必須使用not_analyzed

正如你所看到的我也使用字符串參數讓elasticsearch緩存我的過濾器性能提升。

Image from

+0

您可以請解釋這...我是新的彈性搜索..腳本部分工作原理...在這裏你檢查list.perInd == IXSO,它如何檢查所有的值是否相同? – user2526641

+0

是的,我也有同樣的問題。比較如何確保數組中的所有值是否相同?但神奇的是你的代碼工作。我測試過:) –

+0

我已經使用相同的想法來編寫另一個我認爲很容易理解的查詢,儘管我不知道它的性能問題。 '{「filter」:{「script」:{「script」:「for(value in doc ['list.perInd']。values){if(value!= param)return false}; return true」,「params 「:{」param「:」ixso「}}}}' –

-1

你有一些事情要注意在你的數據模型。所有列表的 首先是一個嵌套的對象,你需要創建一個這樣

curl -XPUT "http://192.168.99.100:9200/testt" -d' 
{ 
     "mappings": { 
     "stack": { 
      "properties": { 
       "list": { 
        "type": "nested" 

       } 
      } 
     } 
    } 
}' 

映射現在讓我們插入我們的例子中數據

curl -XPOST "http://192.168.99.100:9200/testt/stack" -d' 
{ 
      "pkClmn": 676101388023, 
      "dutyCde": "RICE", 
      "list": [ 
       { 
       "pkClmn": 67610138804, 
       "perInd": "IXSO" 
       }, 
       { 
       "pkClmn": 67610138803, 
       "perInd": "IXSO" 
       }, 
       { 
       "pkClmn": 67610138802, 
       "perInd": "IASI" 
       }, 
       { 
       "pkClmn": 67610138801, 
       "perInd": "IASI" 
       } 
      ] 
     }' 

現在讓我們做一個搜索

curl -XPOST "http://192.168.99.100:9200/testt/stack/_search" -d' 
{ 
    "query": { 
     "nested": { 
      "path": "list", 
      "query": { 
       "filtered": { 
       "filter": { 
        "term": { 
         "list.perInd": "ixso" 
        } 
       } 
       } 
      } 
     } 

    } 
}' 

我們將使用帶有術語過濾器的嵌套查詢,過濾器可以緩存在您的案例中,這是最好的選擇。 我希望它有幫助,如果有問題,請問我。

+0

Thanks for Answering ..嵌套對象的性能比非規範化對象低。這就是爲什麼我們儘可能使用了非規範化對象。是否有可能在非規範化的對象中實現相同。 – user2526641

+0

嵌套對象比普通對象快,問題在於你正在執行的查詢。請給我一個你的非規範化數據的例子。 –

+0

上面是非規範化..我們didnt標記對象爲嵌套類型..它是普通對象 – user2526641

相關問題