重新翻译为:"PHP语法的ElasticSearch"
P粉176203781
P粉176203781 2023-08-28 15:43:18
[PHP讨论组]

我是ElasticSearch的新手,对查询的工作原理不太了解... 我的索引示例

{
  "_index" : "indexing001",
  "_type" : "_doc",
  "_id" : "3",
  "_version" : 1,
  "_seq_no" : 242,
  "_primary_term" : 2,
  "found" : true,
  "_source" : {
    "type" : 1,
    "sub_type" : null,
    "user" : {
      "id" : 1,
      "name" : "tk6z2 gcnouvqmr"
    },
    "editor_user" : [ ],
    "content" : [
      {
        "title" : "Title #3",
        "short_text" : "Article #3 short text",
        "full_text" : "Article #3 full text",
        "locale" : "de-DE"
      }
    ],
    "flags" : [ ],
    "location" : [ ],
    "start_date" : 1658793600,
    "end_date" : 1658793600,
    "_users" : [ ]
  }
}

我想查询文本以匹配字段content.titlecontent.short_text,通过_users字段查询用户。 例如,我的函数是:

public static function search(
        string $text = '',
        int $user = 0
    ): array
    {
        try {
            $model = new someModelClass();
            $fields = [
                'content.title',
                'content.short_text',
            ];
            $result = $model::find()->query( [
                'bool' => [
                    'should' => [
                        'multi_match' => [
                            'query'  => $text,
                            'fields' => $fields,
                        ],
                    ],
                    'filter' => [
                        [ 'term' => [ '_users.id' => $user ] ],
                        [ 'term' => [ '_users' => [] ] ],
                    ]
                ],
            ] )->all();

            return $result;
        }
        catch ( Exception $e ) {
            throw new Exception( $e->getMessage() );
        }
    }

将其转换为SQL应该是这样的:SELECT * FROM 'indexing001' WHERE (content.title LIKE %search% OR content.short_text LIKE %search%) AND (users.id = 1 OR users = '') 如何在ElasticSearch查询中编写它? 提前感谢!

P粉176203781
P粉176203781

全部回复(1)
P粉421119778

在这种情况下,我建议使用Elasticsearch-PHP客户端。

请使用composer 安装适当的客户端。

对于如下的匹配查询

curl -XGET 'localhost:9200/my_index/_search' -d '{
    "query" : {
        "match" : {
            "testField" : "abc"
        }
    }
}'

您可以在您的PHP脚本中进行查询,如下所示

$params = [
    'index' => 'my_index',
    'body'  => [
        'query' => [
            'match' => [
                'testField' => 'abc'
            ]
        ]
    ]
];

$results = $client->search($params);

这里查看更多操作。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号