| 70 | } |
| 71 | |
| 72 | bool IsCategorialRequestFuzzy(std::string const & query, std::string const & categoryName) |
| 73 | { |
| 74 | auto const & catHolder = GetDefaultCategories(); |
| 75 | auto const types = GetCategoryTypes(categoryName, "en", catHolder); |
| 76 | |
| 77 | auto const queryTokens = NormalizeAndTokenizeString(query); |
| 78 | |
| 79 | bool isCategorialRequest = false; |
| 80 | for (auto const type : types) |
| 81 | { |
| 82 | if (isCategorialRequest) |
| 83 | return true; |
| 84 | |
| 85 | catHolder.ForEachNameByType(type, [&](CategoriesHolder::Category::Name const & categorySynonym) |
| 86 | { |
| 87 | if (isCategorialRequest) |
| 88 | return; |
| 89 | |
| 90 | auto const categoryTokens = NormalizeAndTokenizeString(categorySynonym.m_name); |
| 91 | for (size_t start = 0; start < queryTokens.size(); ++start) |
| 92 | { |
| 93 | bool found = true; |
| 94 | for (size_t i = 0; i < categoryTokens.size() && start + i < queryTokens.size(); ++i) |
| 95 | { |
| 96 | if (queryTokens[start + i] != categoryTokens[i]) |
| 97 | { |
| 98 | found = false; |
| 99 | break; |
| 100 | } |
| 101 | } |
| 102 | if (found) |
| 103 | { |
| 104 | isCategorialRequest = true; |
| 105 | break; |
| 106 | } |
| 107 | } |
| 108 | }); |
| 109 | } |
| 110 | |
| 111 | return isCategorialRequest; |
| 112 | } |
| 113 | } // namespace search |