下面文章中的方法和其它未说明的内容请前往此文档进行查看:Elasticsearch在PHP中的使用

在PHP中使用ELasticsearch查询时,怎样对内容进行检索,怎样将不同的条件像if一样进行and或or的组合查询,这篇文章就来说说这些事。

先来看几个查询搜索的例子:

  • 单词或多词查询,多个词之间用空格间隔,默认or组合检索,即只要有一个符合就会被检索出来。

//单(多)词查询
$search_where = [
    'match' => [
        'title' => [
            'query' => '删库 别烦我',//检索内容,多个词使用空格隔开
        ]
    ]
];
//或者:精简写法(当无其他参数时,推荐词用法)
$search_where = [
    'match' => [
        'title' =>'删库 别烦我',//检索内容,多个词使用空格隔开
    ]
];
$data = $ES->search_doc($search_where, [], 0, 10);
  • 多词查询,为了提高查询精度想要多个条件同时满足,需要用and进行组合检索,因为使用operator操作符,所以不能在使用精简写法。

//单(多)词查询,提高精度
$search_where = [
    'match' => [
        'title' => [
            'query' => '删库 别烦我',//检索内容,多个词使用空格隔开
            "operator": "and"
        ]
    ]
];
$data = $ES->search_doc($search_where, [], 0, 10);
  • 多词查询,为了控制精度,需要引入minimum_should_match操作符。minimum_should_match 操作符指的是最小匹配参数,这让我们可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字,更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量。

$search_where = [
    'match' => [
        'title' => [
            'query' => '区别 推荐 排序',
            "minimum_should_match"=>"70%"
            //在此三个词的示例中, 75% 会自动被截断成 66.6% ,即至少匹配三个里面的两个词。
        ]
    ]
];
$data = $ES->search_doc($search_where, [], 0, 10);
  • 然后来一个复杂的组合查询:bool过滤查询。

    • 此例子查询返回title字段中带有php词项,但不带有Elasticsearch词项的结果,且结果如果还满足mysql词项或者tp词项,那么_score的值将会更高。

    • bool 查询会为每个文档计算相关度评分 _score ,再将所有匹配的 must 和 should 语句的分数 _score 求和,最后除以 must 和 should 语句的总数。

    • must_not 语句不会影响评分;它的作用只是将不相关的文档排除。

$search_where = [
    'bool' => [
        'must' => [
            'match' => [
                'title' => [
                    'query' => 'php',
                ]
            ]
        ],
        'must_not' => [
            'match' => [
                'title' => [
                    'query' => 'Elasticsearch',
                ]
            ]
        ],
        'should' => [
            'match' => [
                'title' => [
                    'query' => 'mysql tp',
                ]
            ]
        ]
    ]
];
$data = $ES->search_doc($search_where, [], 0, 10);
    • 然后先总结一下bool过滤查询的几种类型:

      Bool查询现在包括四种子句:must、filter、should、must_not

      ①must:

    • 返回的文档必须满足must子句的条件,并且参与计算分值。

      ②filter:

    • 返回的文档必须满足filter子句的条件,但不会像must一样,参与计算分值。

      ③should:

    • 返回的文档可能满足should子句的条件。在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回。minimum_should_match参数定义了至少满足几个子句。

      ④must_not:

    • 返回的文档必须不满足must_not的定义的条件。

  • boost操作符的使用

$search_where = [
    'bool' => [
        'should' => [
            'match' => [
                'title' => [
                    'query' => 'php',
                ]
            ],
            'match' => [
                'description' => [
                    'query' => 'php',
                    'boost'=>9//权重更大

                ]
            ]
        ]
    ]
];
$data = $ES->search_doc($search_where, [], 0, 10);

有关boost使用的补充:

  • 当未定义boost时默认为1,。

  • boost参数是用来提升一个语句的相对权重,当大于1时是提高权重,当处于0-1时是讲定权重,但这种提升或者降低并不是线性的,换句话说,如果一个boost的值为2,并不能获得两倍的_score。

  • 简单来说,更高的boost值为我们带来更高的_score。