We use Examine to index a database with rule definitions. Recently I became aware that for a basic search phrase, such as “admission motion” works fine, but as soon as I add a two character word in the middle such as “admission on motion”, we get a NULL reference error:
[NullReferenceException: Object reference not set to an instance of an object.]
Lucene.Net.Search.BooleanQuery.Rewrite(IndexReader reader) +353
Lucene.Net.Search.BooleanQuery.Rewrite(IndexReader reader) +367
Lucene.Net.Search.IndexSearcher.Rewrite(Query original) +29
Lucene.Net.Search.Query.Weight(Searcher searcher) +52
Lucene.Net.Search.Searcher.Search(Query query, Filter filter, Int32 n, Sort sort) +29
Examine.LuceneEngine.SearchResults.DoSearch(Query query, IEnumerable`1 sortField) +258
Examine.LuceneEngine.Providers.BaseLuceneSearcher.Search(ISearchCriteria searchParams) +181
Ethics.DAL.EthicsDB.getSearchedOpinions(String searchPhrase) +3109
Ethics.Opinions.Page_Load(Object sender, EventArgs e) +682
At first look, I cannot see anything wrong with my code. Thoughts?
public static DataTable getSearchedOpinions(string searchPhrase)
{
searchPhrase = Regex.Replace(searchPhrase, @"[^a-zA-Z0-9'.\s/\*""]{1,40}", String.Empty);
searchPhrase = searchPhrase.Replace(" & ", " & ");
searchPhrase = searchPhrase.Replace(" and ", " ");
searchPhrase = Regex.Replace(searchPhrase, @"\s+", " ");
string[] splitSearchPhrase = Utilities.Split(searchPhrase, " ", "\"");
DataTable dt = new DataTable();
dt.Columns.Add("opinion_ID", typeof(Int32));
dt.Columns.Add("title", typeof(string));
dt.Columns.Add("summary", typeof(string));
dt.Columns.Add("bodytext", typeof(string));
dt.Columns.Add("opinionDate", typeof(DateTime));
dt.Columns.Add("smallOpinionDate", typeof(string));
dt.DefaultView.Sort = "opinion_ID DESC";
Examine.SearchCriteria.IBooleanOperation filter = null;
int i = 0;
var criteria2 = ExamineManager.Instance
.SearchProviderCollection["EthicsOpinionsSearcher"]
.CreateSearchCriteria();
filter = null;
i = 0;
for (i = 0; i < splitSearchPhrase.Length; i++)
{
if (filter == null)
{
filter = criteria2
.GroupedOr(new string[] { "opinion_Num", "title", "summary", "bodytext", "opiniondate", "smallOpinionDate" }, splitSearchPhrase[i].Escape())
.Or()
.GroupedOr(new string[] { "title", "summary", "bodytext" }, splitSearchPhrase[i].Fuzzy(0.7f));
}
else
{
filter = filter
.And()
.GroupedOr(new string[] { "title", "summary", "bodytext", "opiniondate" }, splitSearchPhrase[i].Escape())
.Or()
.GroupedOr(new string[] { "title", "summary", "bodytext" }, splitSearchPhrase[i].Fuzzy(0.7f));
}
}
ISearchResults SearchResults2 = ExamineManager.Instance.SearchProviderCollection["EthicsOpinionsSearcher"].Search(filter.Compile());
foreach (var row in SearchResults2)
{
DataRow dr = dt.NewRow();
dr["opinion_ID"] = row.Fields["opinion_ID"];
dr["title"] = row.Fields["title"];
dr["summary"] = row.Fields["summary"];
dr["bodytext"] = row.Fields["bodytext"];
dr["opinionDate"] = row.Fields["opinionDate"];
dr["smallOpinionDate"] = row.Fields["smallOpinionDate"];
dt.Rows.Add(dr);
}
return dt;
}
This is a companion discussion topic for the original entry at https://our.umbraco.com/forum/71626-examine-search-fails-for-two-character-words