docs: def in_book_search(request):
      """Full text, in-book search."""
      results = {}
  
      args = request.matchdict
      ident_hash = args['ident_hash']
  
      args['search_term'] = request.params.get('q', '')
      query_type = request.params.get('query_type', '')
      combiner = ''
      if query_type:
          if query_type.lower() == 'or':
              combiner = '_or'
  
      id, version = split_ident_hash(ident_hash)
      args['uuid'] = id
      args['version'] = version
  
      with db_connect() as db_connection:
          with db_connection.cursor() as cursor:
              cursor.execute(SQL['get-collated-state'], args)
              res = cursor.fetchall()
              if res and res[0][0]:
                  statement = SQL['get-in-collated-book-search']
              else:
                  statement = SQL['get-in-book-search']
              cursor.execute(statement.format(combiner=combiner), args)
              res = cursor.fetchall()
  
              results['results'] = {'query': [],
                                    'total': len(res),
                                    'items': []}
              results['results']['query'] = {
                  'id': ident_hash,
                  'search_term': args['search_term'],
              }
              for uuid, version, title, snippet, matches, rank in res:
                  results['results']['items'].append({
                      'rank': '{}'.format(rank),
                      'id': '{}@{}'.format(uuid, version),
                      'title': '{}'.format(title),
                      'snippet': '{}'.format(snippet),
                      'matches': '{}'.format(matches),
                  })
  
      resp = request.response
      resp.status = '200 OK'
      resp.content_type = 'application/json'
      resp.body = json.dumps(results)
  
      return resp