forked from organicmaps/organicmaps
[search] Add suggestions only for input language.
This commit is contained in:
parent
09eb7d9551
commit
063f8e11e0
5 changed files with 36 additions and 14 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -15,6 +15,8 @@ class CategoriesHolder
|
|||
public:
|
||||
struct Category
|
||||
{
|
||||
static const uint8_t EMPTY_PREFIX_LENGTH = 10;
|
||||
|
||||
struct Name
|
||||
{
|
||||
string m_name;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue