Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB: $or a full-text search and an $in

The problem

Hi. I have what seems to me as a strange problem and I'm at a loss with it:

Let's take:

tags   = [ ObjectId('a'), ObjectId('b') ]
search = { $search: 'abc' }

Now the following query works fine:

db.entries.find({ $or: [ {$text:search} ] })

And this one too:

db.entries.find({ $or: [ {tags:{$in:tags}} ] })

But combine them:

db.entries.find({ $or: [ {$text:search}, {tags:{$in:tags}} ] })

And I get the following error:

Unable to execute query: error processing query: ns=db.entries
Tree:
  $or
    tags $in [ ObjectId('a'), ObjectId('b') ]
    TEXT : query=abc, language=, tag=NULL
Sort: {}
Proj: {}
 No query solutions

Meta-data

  • I'm using MongoDB version 2.6.4.
  • Combining either of the conditions with a simple {_id:"c"} expression works fine.
  • I do have my text-indices set up properly.
  • The order in which the conditions appear in the $or-array doesn't influence the outcome.

My question

Help? :(

like image 819
Avaq Avatar asked Sep 30 '14 08:09

Avaq


People also ask

Is MongoDB good for full-text search?

While MongoDB's full-text search features may not be as robust as those of some dedicated search engines, they are capable enough for many use cases. Note that there are more search query modifiers — such as case and diacritic sensitivity and support for multiple languages — within a single text index.

How does text search work in MongoDB?

MongoDB text search uses the Snowball stemming library to reduce words to an expected root form (or stem) based on common language rules. Algorithmic stemming provides a quick reduction, but languages have exceptions (such as irregular or contradicting verb conjugation patterns) that can affect accuracy.

What is full-text search vs LIKE?

Compare Full-Text Search queries to the LIKE predicate A LIKE query against millions of rows of text data can take minutes to return; whereas a full-text query can take only seconds or less against the same data, depending on the number of rows that are returned.

What is the advantage of a full-text search?

Conclusion. Users searching full text are more likely to find relevant articles than searching only abstracts. This finding affirms the value of full text collections for text retrieval and provides a starting point for future work in exploring algorithms that take advantage of rapidly-growing digital archives.


1 Answers

Running the query under a slightly different environment produced a much more clear error:

Runner error: BadValue error processing query: ns=webistor.entries limit=0 skip=0
Tree: $or
    tags $in [ ObjectId('a') ObjectId('b') ]
    TEXT : query=abc, language=, tag=NULL
  Sort: {}
  Proj: {}

planner returned error: Failed to produce a solution for TEXT under OR - other non-TEXT clauses under OR have to be indexed as well.

Note

Other non-TEXT clauses under OR have to be indexed as well

Apparently I'll have to add an index to tags.

like image 55
Avaq Avatar answered Oct 10 '22 07:10

Avaq