[search] Add suggestions only for input language.

This commit is contained in:
vng 2012-03-10 19:31:08 +03:00 committed by Alex Zolotarev
parent 09eb7d9551
commit 063f8e11e0
5 changed files with 36 additions and 14 deletions

View file

@ -129,7 +129,7 @@ void CategoriesHolder::LoadFromStream(istream & s)
name.m_name = name.m_name.substr(1);
}
else
name.m_prefixLengthToSuggest = 10;
name.m_prefixLengthToSuggest = Category::EMPTY_PREFIX_LENGTH;
cat.m_synonyms.push_back(name);
}

View file

@ -15,6 +15,8 @@ class CategoriesHolder
public:
struct Category
{
static const uint8_t EMPTY_PREFIX_LENGTH = 10;
struct Name
{
string m_name;

View file

@ -24,7 +24,7 @@
namespace search
{
typedef vector<pair<strings::UniString, uint8_t> > SuggestsContainerT;
typedef vector<Query::SuggestT> SuggestsContainerT;
class EngineData
{
@ -44,21 +44,28 @@ namespace
class InitSuggestions
{
map<strings::UniString, uint8_t> m_suggests;
// Key - is a string with language.
typedef map<pair<strings::UniString, int8_t>, uint8_t> SuggestMapT;
SuggestMapT m_suggests;
public:
void operator() (CategoriesHolder::Category::Name const & name)
{
strings::UniString const uniName = NormalizeAndSimplifyString(name.m_name);
if (name.m_prefixLengthToSuggest != CategoriesHolder::Category::EMPTY_PREFIX_LENGTH)
{
strings::UniString const uniName = NormalizeAndSimplifyString(name.m_name);
uint8_t & score = m_suggests[uniName];
if (score == 0 || score > name.m_prefixLengthToSuggest)
score = name.m_prefixLengthToSuggest;
uint8_t & score = m_suggests[make_pair(uniName, name.m_lang)];
if (score == 0 || score > name.m_prefixLengthToSuggest)
score = name.m_prefixLengthToSuggest;
}
}
void GetSuggests(SuggestsContainerT & cont) const
{
cont.assign(m_suggests.begin(), m_suggests.end());
cont.reserve(m_suggests.size());
for (SuggestMapT::const_iterator i = m_suggests.begin(); i != m_suggests.end(); ++i)
cont.push_back(Query::SuggestT(i->first.first, i->second, i->first.second));
}
};

View file

@ -808,12 +808,13 @@ void Query::MatchForSuggestions(strings::UniString const & token, Results & res)
StringsToSuggestVectorT::const_iterator it = m_pStringsToSuggest->begin();
for (; it != m_pStringsToSuggest->end(); ++it)
{
strings::UniString const & s = it->first;
if ((it->second <= token.size()) &&
(token != s) && // do not push suggestion if it already equals to token
strings::UniString const & s = it->m_name;
if ((it->m_prefixLength <= token.size()) &&
(token != s) && // do not push suggestion if it already equals to token
(it->m_lang == m_inputLang) && // push suggestions only for input language
StartsWith(s.begin(), s.end(), token.begin(), token.end()))
{
res.AddResult(MakeResult(impl::PreResult2(strings::ToUtf8(s), it->second)));
res.AddResult(MakeResult(impl::PreResult2(strings::ToUtf8(s), it->m_prefixLength)));
}
}
}

View file

@ -41,8 +41,20 @@ class Query
public:
static int const m_scaleDepthSearch = 7;
// Vector of pairs (string_to_suggest, min_prefix_length_to_suggest).
typedef vector<pair<strings::UniString, uint8_t> > StringsToSuggestVectorT;
struct SuggestT
{
strings::UniString m_name;
uint8_t m_prefixLength;
int8_t m_lang;
SuggestT(strings::UniString const & name, uint8_t len, int8_t lang)
: m_name(name), m_prefixLength(len), m_lang(lang)
{
}
};
// Vector of suggests.
typedef vector<SuggestT> StringsToSuggestVectorT;
Query(Index const * pIndex,
CategoriesHolder const * pCategories,