Martin,

It is important to remember that Search(...) does not work from the text 
representation of the Query object that you see when you use the ToString() 
method.  Instead it works from the type of objects of which the Query object is 
composed and the clauses that join them together.

It is entirely possible that there is a bug or operational quirk in ToString(), 
which makes your two Query objects look identical even when they are not.  (For 
example, maybe your QueryBuilder is inserting a null Term that causes the 
search to fail, but that ToString() does not list since it is null, 
meaningless, term.)

Another possibility to look at is your "internalSearcher" object.  Are you 
absolutely sure that it is being constructed in exactly the same way for both 
searches?

-- Neal

-----Original Message-----
From: Martin Nilsson [mailto:[EMAIL PROTECTED]
Sent: Sunday, February 10, 2008 12:42 PM
To: [email protected]
Subject: QueryParser vs own QueryBuilder

Hi,

I'm struggling with a problem I can't solve. I create my Query object from
my own implemented query builder. However, I don't get any results back but
if I do a query.ToString and send it to the QueryParser I get result. Let me
show you some code.

//this doesn't return any results
//query.ToString() = "+category:general +product_type:1763 +title:\"shirt
brewality\" +country:2 +whitelabel:5 +price_type:1"
ISearchResult<ITinyItem> searchResult2 = searcher.Search(query);

//this returns 4 results
//query.Clone().ToString() = "+category:general +product_type:1763
+title:\"shirt brewality\" +country:2 +whitelabel:5 +price_type:1"
ISearchResult<ITinyItem> searchResult = searcher.Search(query.Clone
().ToString());

//this is called from query.Clone().ToString() above
public ISearchResult<T> Search(string searchTerms)
{
  if (string.IsNullOrEmpty(searchTerms)) throw new
ArgumentNullException("searchTerms");

  QueryParser parser = new QueryParser(defaultField, analyzer);
  parser.SetFuzzyMinSim(fuzzyMinSimilarity);
  Query query = parser.Parse(searchTerms);
  //the one that doesn't return any results calls below (Search(Query))
directly.
  //So the only, what I can see, difference is the code above in this
function
  return Search(query);
}

//and both are calling this
public ISearchResult<T> Search(Query query)
{
  //query.ToString() returns below result for BOTH, the one that returns 0
and the one that returns 4 result, queries
  //"+category:general +product_type:1763 +title:\"shirt brewality\"
+country:2 +whitelabel:5 +price_type:1"
  Hits hits = internalSearcher.Search(query);
  //code to create result
  ...
}

I have looked at the types of the underlying query and they are also the
same. BooleanQuery with 6 clauses where 5 are term queries and one, title,
is a phrase query. Looks the same both for my query and the one that
QueryParser.Parse creates.

I'm sooo confused! Please help!

Br,
Martin

Reply via email to