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

PHP Elastica过滤搜索在预期时不返回结果

姜飞飙
2023-03-14
{
    "value_a": "Foo",
    "value_b": "Bar",
    "value_c": "Baz"
}
{
    "_index": "foo_bar_bazindex",
    "_type": "foo_bar_baz",
    "_id": "4",
    "_score": 1,
    "_source": {
        "value_a": "Foo",
        "value_b": "Bar",
        "value_c": "Baz"
    }
}

值a、b和c的组合是唯一的。

我想通过使用值a和b执行bool筛选搜索来查找“value_c”的值。

在我的代码中,我尝试如下:

    $filter = new \Elastica\Filter\Bool();
    $query = new \Elastica\Query();

    $aFilter = new \Elastica\Filter\Term(['value_a' => "Foo"]);
    $bFilter = new \Elastica\Filter\Term(['value_b' => "Bar"]);

    $filter->addMust($aFilter);
    $filter->addMust($bFilter);

    $query->setFilter($filter);

    $results = $this->bookingPeriodIndex->search($query)->getResults();

    var_dump($results);
{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "value_a": "Foo"
                            }
                        },
                        {
                            "term": {
                                "value_b": "Bar"
                            }
                        }
                    ]
                }
            }
        }
    }
}
{
    "value_a": "Foo",
    "value_b": "Bar",
    "value_c": "Baz"
}

我是不是漏掉了什么?会不会是因为数据集太小?我们在代码库的其他地方使用了相同的Bool Filter Elastica查询,这些查询如预期的那样工作,但是我似乎无法从这个索引中返回任何数据。

如有任何帮助,不胜感激。

共有1个答案

艾望
2023-03-14

最后,通过使用带有两个match语句的bool查询,我得到了所要查找的结果:

原始查询:

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "value_a": "Foo"
                    }
                },
                {
                    "match": {
                        "value_b": "Bar"
                    }
                }
            ]
        }
    }
}

使用Elastica的查询:

$query = new Query;
$booleanQuery = new Bool();

$fooMatch = new Match();
$fooMatch->setField('value_a', 'Foo');
$booleanQuery->addMust($fooMatch);

$barMatch = new Match();
$barMatch->setField('value_b', 'Bar');
$booleanQuery->addMust($barMatch);

$query->setQuery($booleanQuery);

$results = $this->index->search($query)->getResults();
 类似资料:
  • 试图找出这个微不足道的例子的分数。我希望得到brenda eaton的文件,但我得到的是brenda fassie的最佳结果。

  • 我正在用Hibernate Search 4.5.1和Spring 4.0.5版本构建一个应用程序。我正在尝试索引以下类: 我正在构建一个junit测试用例,看起来如下所示: 我还注意到在luke lucene上,一些索引词的长度最多为6个字符,例如,一首歌的艺术家是“后代”,而索引中存储的词是“the”和“offspr”。第一个可以,但第二个不应该是“后代”。为什么要截断名字?

  • 我有一个带有两个衰减函数(ES 2.4.4)的查询,我使用对查询项中的衰减函数得分求和。对于测试,我使用来防止任何其他分数(来自查询)影响我的分数(我想测试衰减函数)。 这些是我的衰减函数: 我的结果包括2篇不同日期的文章(2017-08-28,2009-05-08)具有相同的优先级(1000)和相同的分数!(13.122)怎么会这样?为什么没有获得更好的分数?所以我试图解释查询。 对于2017-

  • 问题内容: 每当我在应用程序中搜索时,都会显示正确的结果,但是当我点击搜索的单元格时,在执行搜索之前,它始终会播放表格的第一个索引。我试图在我的didselectcell中使用isSearching Bool,但似乎无法正常工作。 问题答案: 我认为问题在于您正在跟踪自己是否在搜索和操作源数据数组。 我有一个示例游乐场代码段,我已将其用于其他一些答案,该示例向您展示了如何更有效地执行此操作,并提供

  • filter命令未按预期工作。如何重构代码以获得请求的输出? 在

  • 我想mock接受对象参数的方法。此对象参数是从动态创建的。不会返回预期的结果,尽管这两个对象具有相同的数据,但只是不同的哈希代码。 有没有什么方法来模拟方法,使它能够以预期的结果响应?