當前位置: 首頁> 最新文章列表> 構建Elasticsearch 查詢字段數組

構建Elasticsearch 查詢字段數組

M66 2025-05-11

在實際開發中,PHP 提供了非常多的便利函數來處理數組, array_column函數便是其中之一。 array_column可以幫助我們提取二維數組中的某一列,並返回一個包含該列值的新數組。對於構建Elasticsearch 查詢字段數組時, array_column函數非常有用。

本文將介紹如何使用array_column來構建Elasticsearch 查詢字段數組,尤其是如何從原始數據中提取特定字段,方便我們進一步構造Elasticsearch 查詢。

1. 什麼是array_column函數?

array_column是PHP 中的一個內建函數,作用是從二維數組中提取指定列的所有值,並將這些值返回為一個新的一維數組。這個函數的基本語法如下:

 array_column(array $array, $column_key, $index_key = null): array
  • $array :輸入的多維數組。

  • $column_key :需要提取的列的鍵名。

  • $index_key :可選參數,指定用於索引結果數組的列(若沒有提供,則結果數組會自動使用數字索引)。

2. 示例:構建Elasticsearch 查詢字段數組

假設你有一個包含文檔數據的二維數組,每個文檔包含多個字段,例如id , name , category等。你希望從中提取所有category字段,構建一個數組,供Elasticsearch 查詢使用。

2.1. 原始數據

假設原始數據如下:

 $documents = [
    ['id' => 1, 'name' => 'Apple', 'category' => 'Fruit', 'url' => 'http://example.com/apple'],
    ['id' => 2, 'name' => 'Carrot', 'category' => 'Vegetable', 'url' => 'http://example.com/carrot'],
    ['id' => 3, 'name' => 'Banana', 'category' => 'Fruit', 'url' => 'http://example.com/banana'],
    ['id' => 4, 'name' => 'Spinach', 'category' => 'Vegetable', 'url' => 'http://example.com/spinach']
];

2.2. 使用array_column提取category字段

我們可以使用array_column函數從中提取出所有的category字段,構建一個數組,方便用於Elasticsearch 查詢。

 $categories = array_column($documents, 'category');
print_r($categories);

輸出結果:

 Array
(
    [0] => Fruit
    [1] => Vegetable
    [2] => Fruit
    [3] => Vegetable
)

2.3. 構建Elasticsearch 查詢字段數組

假設你需要根據category字段構建一個Elasticsearch 查詢,查找屬於Fruit類別的文檔。你可以這樣做:

 $searchTerm = 'Fruit';
$query = [
    'query' => [
        'terms' => [
            'category' => array_column(
                array_filter($documents, function($doc) use ($searchTerm) {
                    return $doc['category'] === $searchTerm;
                }),
                'id'
            )
        ]
    ]
];

// 打印查詢內容
print_r($query);

假設我們要查詢category字段為Fruit的文檔, array_filter會先過濾出所有categoryFruit的文檔,然後使用array_column從中提取id字段,最後構建出Elasticsearch 查詢數組。

輸出的查詢數組可能如下所示:

 Array
(
    [query] => Array
        (
            [terms] => Array
                (
                    [category] => Array
                        (
                            [0] => 1
                            [1] => 3
                        )
                )
        )
)

3. 完整代碼示例

<?php

$documents = [
    ['id' => 1, 'name' => 'Apple', 'category' => 'Fruit', 'url' => 'http://example.com/apple'],
    ['id' => 2, 'name' => 'Carrot', 'category' => 'Vegetable', 'url' => 'http://example.com/carrot'],
    ['id' => 3, 'name' => 'Banana', 'category' => 'Fruit', 'url' => 'http://example.com/banana'],
    ['id' => 4, 'name' => 'Spinach', 'category' => 'Vegetable', 'url' => 'http://example.com/spinach']
];

// 使用 array_column 提取所有的 category 字段
$categories = array_column($documents, 'category');
print_r($categories);

// 構建 Elasticsearch 查詢字段數組
$searchTerm = 'Fruit';
$query = [
    'query' => [
        'terms' => [
            'category' => array_column(
                array_filter($documents, function($doc) use ($searchTerm) {
                    return $doc['category'] === $searchTerm;
                }),
                'id'
            )
        ]
    ]
];

// 打印查詢內容
print_r($query);

?>

4. 總結

array_column函數非常適用於從多維數組中提取特定列的數據,尤其在構建Elasticsearch 查詢時,它能夠高效地提取我們需要的字段,幫助我們構造出正確的查詢格式。

如果你的數據源中包含了大量的文檔,使用array_column函數能夠顯著提高代碼的簡潔性和可讀性,也能有效避免手動遍歷數組的麻煩。

通過結合其他數組操作函數(如array_filter )和array_column ,我們可以靈活地為Elasticsearch 構建複雜的查詢字段數組,以滿足不同的查詢需求。

希望這篇文章對你有所幫助!如果有任何疑問,或者希望了解更多PHP 數組操作的技巧,隨時歡迎提問!