Searching for documents

edit

Searching for documents

edit

A very common use-case for elasticsearch is to sort through large collections of documents in order to find ones that are relevant to a query. In most cases you will use the client’s search() method to accomplish this.

Elasticsearch Query DSL

edit

For many searches you will want to define a search document that tells elasticsearch exactly how to find the documents you are looking for. To do this you will use the elasticsearch query DSL. If you are not familiar with Elasticsearch’s query DSL it is recommended that you research the topic at elasticsearch.org or watch/read one of these introductions:

Now for some examples using the Query DSL.

Simple match query

edit

Find tweets that have "elasticsearch" in their body field.

client.search({
  index: 'twitter',
  type: 'tweets',
  body: {
    query: {
      match: {
        body: 'elasticsearch'
      }
    }
  }
}).then(function (resp) {
    var hits = resp.hits.hits;
}, function (err) {
    console.trace(err.message);
});

More complex filtered query

edit

To power a search form on a public site, you might want to allow the user to specify some text but also limit the documents returned by a few criteria. This is a good use-case for a filtered query.

In this example, request and response are Express request and response objects.

var pageNum = request.params.page;
var perPage = request.params.per_page;
var userQuery = request.params.search_query;
var userId = request.session.userId;

var searchParams = {
  index: 'posts',
  from: (pageNum - 1) * perPage,
  size: perPage,
  body: {
    query: {
      filtered: {
        query: {
          match: {
            // match the query against all of
            // the fields in the posts index
            _all: userQuery
          }
        },
        filter: {
          // only return documents that are
          // public or owned by the current user
          or: [
            {
              term: { privacy: "public" }
            },
            {
              term: { owner: userId }
            }
          ]
        }
      }
    }
  }
};

client.search(searchParams, function (err, res) {
  if (err) {
    // handle error
    throw err;
  }

  response.render('search_results', {
    results: res.hits.hits,
    page: pageNum,
    pages: Math.ceil(res.hits.total / perPage)
  });
});

You can find a lot more information about filters here