The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Elastic::Model::SearchBuilder - An Elastic::Model specific subclass of ElasticSearch::SearchBuilder

VERSION

version 0.52

DESCRIPTION

Elastic::Model::SearchBuilder is a sub-class of ElasticSearch::SearchBuilder to add automatic handling of Elastic::Doc and Elastic::Model::UID values.

This document just explains the functionality that Elastic::Model::SearchBuilder adds.

For the full SearchBuilder docs, see ElasticSearch::SearchBuilder.

THE PROBLEM

Consider this class (where MyApp::User is also an Elastic::Doc class):

    package MyApp::Comment;

    use Elastic::Doc;

    has 'user' => (
        is     => 'ro',
        isa    => 'MyApp::User,
    );

    has 'text' => (
        is     => 'ro',
        isa    => 'Str',
    );

We can create a comment as follows:

    $domain->create(
        comment => {
            text => 'I like Elastic::Model',
            user => $user,
        }
    );

The comment object would be stored in Elasticsearch as something like this:

    {
        text    => "I like Elastic::Model",
        user    => {
            uid => {
                index   => 'myapp',
                type    => 'user',
                id      => 'abcdefg',
            },
            .... any other user fields....
        }
    }

In order to search for any comments by user $user, you would need to do this:

    $view->type('comment')
         ->filterb(
                'user.uid.index' => $user->uid->index,
                'user.uid.type'  => $user->uid->type,
                'user.uid.id'    => $user->uid->id,
           )
         ->search;

THE SOLUTION

With Elastic::Model::SearchBuilder, you can do it as follows:

    $view->type('comment')
         ->filterb( user => $user )
         ->search;

Or with the UID:

    $view->type('comment')
         ->filterb( user => $user->uid )
         ->search;

FURTHER EXAMPLES

Query or Filter

This works for both queries and filters, eg:

    $view->queryb ( user => $user )->search;
    $view->filterb( user => $user )->search;

Doc or UID

You can use either the doc/object itself, or an Elastic::Model::UID object:

    $uid = $user->uid;
    $view->queryb ( user => $uid )->search;
    $view->filterb( user => $uid )->search;

Negating queries:

    $view->queryb ( user => { '!=' => $user })->search;
    $view->filterb( user => { '!=' => $user })->search;

"IN" queries

    $view->queryb ( user => \@users )->search;
    $view->filterb( user => \@users )->search;

"NOT IN" queries

    $view->queryb ( user => { '!=' => \@users })->search;
    $view->filterb( user => { '!=' => \@users })->search;

AUTHOR

Clinton Gormley <drtech@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by Clinton Gormley.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.