示例#1
0
        public long Query(string queryData, bool addQueryToDictionary = false)
        {
            long queryId = -1;

            if (!string.IsNullOrWhiteSpace(queryData))
            {
                QueryTransaction newQueryTransaction = m_QueryBuilder.BuildQueryTransaction(queryData);

                bool queryExists = false;
                for (int queryIndex = 0; queryIndex < m_Queries.Count; ++queryIndex)
                {
                    if (m_Queries[queryIndex].WordIds.SequenceEqual(newQueryTransaction.WordIds))
                    {
                        queryExists = true;
                        queryId     = queryIndex;
                        break;
                    }
                }

                if (addQueryToDictionary && !queryExists)
                {
                    queryId = m_Queries.Count;
                    m_Queries.Add(newQueryTransaction);
                    m_IsDictionaryDirty = true;
                }
            }
            return(queryId);
        }
示例#2
0
        private List <RankedTransaction> FindInternal(string searchQuery)
        {
            List <RankedTransaction> rankedQueryTransactions = new List <RankedTransaction>();

            if (!string.IsNullOrEmpty(searchQuery))
            {
                QueryTransaction searchQueryTransaction = m_QueryBuilder.BuildQueryTransaction(searchQuery);
                foreach (var searchWordId in searchQueryTransaction.WordIds)
                {
                    // Get partial search matches for the searchWordId
                    List <long> partialSearchMatches = m_WordDictionary.FindPartialMatches(searchWordId);

                    // Full and partial match strategy
                    for (int queryIndex = 0; queryIndex < m_Queries.Count; ++queryIndex)
                    {
                        var query = m_Queries[queryIndex];
                        // Full match
                        if (query.WordIds.Contains(searchWordId))
                        {
                            var rankedQuery = rankedQueryTransactions.Find(x => x.QueryTranscationRef == query);
                            if (rankedQuery == null)
                            {
                                rankedQuery = new RankedTransaction(query, queryIndex);
                                rankedQuery.NumberOfMatchedWords++;
                                rankedQueryTransactions.Add(rankedQuery);
                            }
                            else
                            {
                                rankedQuery.NumberOfMatchedWords++;
                            }
                        }
                        // Partial match
                        else
                        {
                            foreach (var queryWordId in query.WordIds)
                            {
                                if (partialSearchMatches.Contains(queryWordId))
                                {
                                    var rankedQuery = rankedQueryTransactions.Find(x => x.QueryTranscationRef == query);
                                    if (rankedQuery == null)
                                    {
                                        rankedQuery = new RankedTransaction(query, queryIndex);
                                        rankedQuery.NumberOfMatchedPartialCharacters++;
                                        rankedQueryTransactions.Add(rankedQuery);
                                    }
                                    else
                                    {
                                        rankedQuery.NumberOfMatchedPartialCharacters++;
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }

                rankedQueryTransactions.Sort(delegate(RankedTransaction x, RankedTransaction y)
                {
                    // Lower the number the x is pushed up the sort. 0 means no change
                    if (x.NumberOfMatchedWords == y.NumberOfMatchedWords)
                    {
                        if (x.NumberOfMatchedPartialCharacters > y.NumberOfMatchedPartialCharacters)
                        {
                            return(0);
                        }
                        else if (x.NumberOfMatchedPartialCharacters < y.NumberOfMatchedPartialCharacters)
                        {
                            return(1);
                        }
                    }
                    else if (x.NumberOfMatchedWords > y.NumberOfMatchedWords)
                    {
                        return(0);
                    }
                    else if (x.NumberOfMatchedWords < y.NumberOfMatchedWords)
                    {
                        return(1);
                    }
                    return(0);
                });
            }

            return(rankedQueryTransactions);
        }
示例#3
0
 public RankedTransaction(QueryTransaction queryTransaction, long queryId)
 {
     QueryTranscationRef = queryTransaction;
     QueryId             = queryId;
 }