【问题标题】:Elasticsearch either or match queryElasticsearch 或者匹配查询
【发布时间】:2015-06-07 18:13:49
【问题描述】:

我正在尝试编写一个查询来搜索名为 category1category2 的两列上的产品。我正在使用弹性搜索 php 客户端并尝试使用 match 应该查询,但是由于子字符串的匹配,这给了我错误的结果。

但我正在寻找与两列上的 OR 操作的完全匹配。我是新手,请指导我。

    $params['index'] = 'furnit';
    $params['type']  = 'products';
    $params['body']['query']['bool']['should'] = array(
        array('match' => array('category1' => $category->name)),
        array('match' => array('category2' => $category->name)),
    );

    $results = $this->elasticsearch->search($params);

【问题讨论】:

  • 如果您有这些类别的类别 ID,您应该使用它,如果您不是在寻找分数和相关性,我认为在类别 ID 上使用布尔过滤器可能是正确的方法去做吧。还要考虑 - 布尔查询的 minimum_number_should_match 参数。

标签: php elasticsearch


【解决方案1】:

如果您不进行搜索,那么在这种情况下使用 bool 查询不是在 elasticsearch 中执行此操作的正确方法。当您搜索某些内容时使用查询,搜索关键字的相关性和匹配文档的分数很重要。

在这里您可以应用弹性搜索的布尔过滤器来过滤掉所需的结果。使用带有查询的过滤器(过滤查询)是正确的方法,因为它会排除所有不匹配的文档,然后您可以使用匹配查询来搜索所需的文档。

这是一个布尔过滤器的示例

{
    "from": 0,
    "size": 50,
    "sort": [
        {
            "name" : {
                "order": "asc" 
            }
        }
    ],
    "query": {
        "filtered": {
            "query": {
                "match_all" : {} 
            },
            "filter": {
                "bool": { 
                    "should": [
                        {
                            "term": {
                                "category1" : "category1"  
                            }
                        },
                        {
                            "term": {
                                "category2" : "category2"
                            }
                        }
                    ]
                }
            }
        }
    }
}

您也可以参考文档 (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html)

【讨论】:

    【解决方案2】:

    也许您的问题是您使用了默认分析器(即标准分析器)。 你能给我你的映射吗? 我建议您在索引时更改为使用 not_analyzer 并使用术语过滤器/查询。

    您可以在此处使用 put 映射来设置您的分析器:Put Mapping

    编辑:我为您创建了一个要点,请在此处查看:

    Mappings & Terms Filter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多