当前位置: 首页 > 知识库问答 >
问题:

弹性搜索PHP包中使用“and”运算符进行搜索

凌远
2023-03-14

我正在尝试学习弹性搜索与php composer包的帮助。我有一个索引,其名称为media_data,其中包含nits_accountnits_urlsession_idtimestamp字段。我想有基于以上字段的过滤器,它应该在操作符。我当前的查询代码是:

$items = $this->elasticsearch->search([
    'index' => $index_name,
    'body'  => [
        'query' => [
            'filtered' => [
                'filter' => [
                    'and' => [
                        ['match' => ['nits_account' => 'xyzABCD2190-aldsj']],  //API Key
                        ['match' => ['nits_url' => 'google.com']],
                    ]
                ]
            ]
        ]
    ]
]);

我的问题是:

>

  • 我无法获取数据。但是如果我执行下面的代码:

    $items = $this->elasticsearch->search([
        'index' => $index_name,
        'body'  => [
            'query' => [
                 'bool' => [
                    'should' => [
                        ['match' => ['nits_account' => $account] ],
                        ['match' => ['nits_url' => $domain] ],
                    ],
                ], 
            ]
        ]
    ]);
    

    我在运算符中获取值,但需要在其中包含操作。

  • 共有1个答案

    欧阳鸿德
    2023-03-14

    试试这个:

    $items = $this->elasticsearch->search([
        'index' => $index_name,
        'body'  => [
            'query' => [
                 'bool' => [
                    'must' => [
                        ['match' => ['nits_account' => $account] ],
                        ['match' => ['nits_url' => $domain] ]
                    ],
                ], 
            ]
        ]
    ]);
    

    您应该使用must关键字,而不是shoul关键字。必须类似于AND操作,而应该类似于OR操作。

    请参见https://stackoverflow.com/a/28768600/5430055

    "query": {
        "bool": {
          "must": [
            {
              "range": {
                "nits_url": {
                  "gte": 1000,
                  "lte": 10000
                }
              }
            },
            {
              "match": {
                "nits_account": "$account"
              }
            }
          ]
        }
      }
    
     类似资料:
    • 由于已经有很多关于连字符的问题,我已经尝试了以下解决方案: 使用字符筛选器:ElasticSearch-在名称中使用连字符进行搜索。 所以我做了这个映射: 所以char筛选器似乎没有在搜索字符串上执行?我该怎么做才能让它起作用?

    • 尝试使用通配符进入和弹性搜索精确短语搜索时遇到问题query_string。 希望能够返回结果,这将是所有变体的精确短语。i、 e.“库尔斯酿酒厂”、“库尔斯酿酒厂”、“库尔斯酿酒厂”等。 我不同意这种方法,但想搜索大部分文档以找到匹配的1或2个字段。

    • 问题内容: 我想以查询其他字段的相同方式将多值字段的值查询为单独的“字段”。我有这样的数据结构: 我的查询如下所示: 仅当值包含我的整个查询时,“类型”和“运算符”才能完美匹配单个值字段。例如,查询“ foo two”不会返回匹配项。 我希望标签字段的行为相同。现在,查询“东西”将在不应该返回匹配项时返回匹配项,因为没有字段或标记值将两个单词都包含在一个值中。有没有办法做到这一点? 编辑 Val的

    • 这很有魅力: 但如果我想按多个单词搜索,它将不返回任何内容,例如: 当我使用CURL时,我通过将添加到我的JSON属性来解决这个问题: 卷曲-XGET“http://localhost:9200/_search“-d”{“查询”:{“匹配”:{“字段”:{“查询”:“word\u 1 word\u 2”,““模糊性”:“自动”,““运算符”:“和”}}}}}” 我如何在Java中实现这一点?

    • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。

    • 如何配置Netflix conductor以运行独立的弹性搜索而不是嵌入式弹性搜索?