mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 15:42:02 +00:00
Merge pull request #5418 from yandex/ngram_non_symmetric
ngramEntry function was added
This commit is contained in:
commit
61a1d91d71
@ -32,7 +32,7 @@ namespace DB
|
|||||||
* calculation. If the right string size is big (more than 2**15 bytes),
|
* calculation. If the right string size is big (more than 2**15 bytes),
|
||||||
* the strings are not similar at all and we return 1.
|
* the strings are not similar at all and we return 1.
|
||||||
*/
|
*/
|
||||||
template <size_t N, class CodePoint, bool UTF8, bool CaseInsensitive>
|
template <size_t N, class CodePoint, bool UTF8, bool CaseInsensitive, bool Symmetric>
|
||||||
struct NgramDistanceImpl
|
struct NgramDistanceImpl
|
||||||
{
|
{
|
||||||
using ResultType = Float32;
|
using ResultType = Float32;
|
||||||
@ -138,6 +138,7 @@ struct NgramDistanceImpl
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// This is not a really true case insensitive utf8. We zero the 5-th bit of every byte.
|
/// This is not a really true case insensitive utf8. We zero the 5-th bit of every byte.
|
||||||
|
/// And first bit of first byte if there are two bytes.
|
||||||
/// For ASCII it works https://catonmat.net/ascii-case-conversion-trick. For most cyrrilic letters also does.
|
/// For ASCII it works https://catonmat.net/ascii-case-conversion-trick. For most cyrrilic letters also does.
|
||||||
/// For others, we don't care now. Lowering UTF is not a cheap operation.
|
/// For others, we don't care now. Lowering UTF is not a cheap operation.
|
||||||
if constexpr (CaseInsensitive)
|
if constexpr (CaseInsensitive)
|
||||||
@ -151,6 +152,7 @@ struct NgramDistanceImpl
|
|||||||
res &= ~(1u << (5 + 2 * CHAR_BIT));
|
res &= ~(1u << (5 + 2 * CHAR_BIT));
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
case 2:
|
case 2:
|
||||||
|
res &= ~(1u);
|
||||||
res &= ~(1u << (5 + CHAR_BIT));
|
res &= ~(1u << (5 + CHAR_BIT));
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
default:
|
default:
|
||||||
@ -222,9 +224,10 @@ struct NgramDistanceImpl
|
|||||||
for (; iter + N <= found; ++iter)
|
for (; iter + N <= found; ++iter)
|
||||||
{
|
{
|
||||||
UInt16 hash = hash_functor(cp + iter);
|
UInt16 hash = hash_functor(cp + iter);
|
||||||
|
/// For symmetric version we should add when we can't subtract to get symmetric difference.
|
||||||
if (static_cast<Int16>(ngram_stats[hash]) > 0)
|
if (static_cast<Int16>(ngram_stats[hash]) > 0)
|
||||||
--distance;
|
--distance;
|
||||||
else
|
else if constexpr (Symmetric)
|
||||||
++distance;
|
++distance;
|
||||||
if constexpr (ReuseStats)
|
if constexpr (ReuseStats)
|
||||||
ngram_storage[ngram_cnt] = hash;
|
ngram_storage[ngram_cnt] = hash;
|
||||||
@ -267,7 +270,8 @@ struct NgramDistanceImpl
|
|||||||
if (data_size <= max_string_size)
|
if (data_size <= max_string_size)
|
||||||
{
|
{
|
||||||
size_t first_size = dispatchSearcher(calculateHaystackStatsAndMetric<false>, data.data(), data_size, common_stats, distance, nullptr);
|
size_t first_size = dispatchSearcher(calculateHaystackStatsAndMetric<false>, data.data(), data_size, common_stats, distance, nullptr);
|
||||||
res = distance * 1.f / std::max(first_size + second_size, size_t(1));
|
/// For !Symmetric version we should not use first_size.
|
||||||
|
res = distance * 1.f / std::max(Symmetric * first_size + second_size, size_t(1));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -326,7 +330,10 @@ struct NgramDistanceImpl
|
|||||||
--common_stats[needle_ngram_storage[j]];
|
--common_stats[needle_ngram_storage[j]];
|
||||||
|
|
||||||
/// For now, common stats is a zero array.
|
/// For now, common stats is a zero array.
|
||||||
res[i] = distance * 1.f / std::max(haystack_stats_size + needle_stats_size, size_t(1));
|
|
||||||
|
|
||||||
|
/// For !Symmetric version we should not use haystack_stats_size.
|
||||||
|
res[i] = distance * 1.f / std::max(Symmetric * haystack_stats_size + needle_stats_size, size_t(1));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -340,6 +347,71 @@ struct NgramDistanceImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void constant_vector(
|
||||||
|
std::string haystack,
|
||||||
|
const ColumnString::Chars & needle_data,
|
||||||
|
const ColumnString::Offsets & needle_offsets,
|
||||||
|
PaddedPODArray<Float32> & res)
|
||||||
|
{
|
||||||
|
/// For symmetric version it is better to use vector_constant
|
||||||
|
if constexpr (Symmetric)
|
||||||
|
{
|
||||||
|
vector_constant(needle_data, needle_offsets, std::move(haystack), res);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const size_t haystack_size = haystack.size();
|
||||||
|
haystack.resize(haystack_size + default_padding);
|
||||||
|
|
||||||
|
/// For logic explanation see vector_vector function.
|
||||||
|
const size_t needle_offsets_size = needle_offsets.size();
|
||||||
|
size_t prev_offset = 0;
|
||||||
|
|
||||||
|
NgramStats common_stats = {};
|
||||||
|
|
||||||
|
std::unique_ptr<UInt16[]> needle_ngram_storage(new UInt16[max_string_size]);
|
||||||
|
std::unique_ptr<UInt16[]> haystack_ngram_storage(new UInt16[max_string_size]);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < needle_offsets_size; ++i)
|
||||||
|
{
|
||||||
|
const char * needle = reinterpret_cast<const char *>(&needle_data[prev_offset]);
|
||||||
|
const size_t needle_size = needle_offsets[i] - prev_offset - 1;
|
||||||
|
|
||||||
|
if (needle_size <= max_string_size && haystack_size <= max_string_size)
|
||||||
|
{
|
||||||
|
const size_t needle_stats_size = dispatchSearcher(
|
||||||
|
calculateNeedleStats<true>,
|
||||||
|
needle,
|
||||||
|
needle_size,
|
||||||
|
common_stats,
|
||||||
|
needle_ngram_storage.get());
|
||||||
|
|
||||||
|
size_t distance = needle_stats_size;
|
||||||
|
|
||||||
|
dispatchSearcher(
|
||||||
|
calculateHaystackStatsAndMetric<true>,
|
||||||
|
haystack.data(),
|
||||||
|
haystack_size,
|
||||||
|
common_stats,
|
||||||
|
distance,
|
||||||
|
haystack_ngram_storage.get());
|
||||||
|
|
||||||
|
for (size_t j = 0; j < needle_stats_size; ++j)
|
||||||
|
--common_stats[needle_ngram_storage[j]];
|
||||||
|
|
||||||
|
res[i] = distance * 1.f / std::max(needle_stats_size, size_t(1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res[i] = 1.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
prev_offset = needle_offsets[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void vector_constant(
|
static void vector_constant(
|
||||||
const ColumnString::Chars & data,
|
const ColumnString::Chars & data,
|
||||||
const ColumnString::Offsets & offsets,
|
const ColumnString::Offsets & offsets,
|
||||||
@ -373,7 +445,8 @@ struct NgramDistanceImpl
|
|||||||
haystack_size, common_stats,
|
haystack_size, common_stats,
|
||||||
distance,
|
distance,
|
||||||
ngram_storage.get());
|
ngram_storage.get());
|
||||||
res[i] = distance * 1.f / std::max(haystack_stats_size + needle_stats_size, size_t(1));
|
/// For !Symmetric version we should not use haystack_stats_size.
|
||||||
|
res[i] = distance * 1.f / std::max(Symmetric * haystack_stats_size + needle_stats_size, size_t(1));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -391,7 +464,6 @@ struct NameNgramDistance
|
|||||||
{
|
{
|
||||||
static constexpr auto name = "ngramDistance";
|
static constexpr auto name = "ngramDistance";
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NameNgramDistanceCaseInsensitive
|
struct NameNgramDistanceCaseInsensitive
|
||||||
{
|
{
|
||||||
static constexpr auto name = "ngramDistanceCaseInsensitive";
|
static constexpr auto name = "ngramDistanceCaseInsensitive";
|
||||||
@ -407,10 +479,34 @@ struct NameNgramDistanceUTF8CaseInsensitive
|
|||||||
static constexpr auto name = "ngramDistanceCaseInsensitiveUTF8";
|
static constexpr auto name = "ngramDistanceCaseInsensitiveUTF8";
|
||||||
};
|
};
|
||||||
|
|
||||||
using FunctionNgramDistance = FunctionsStringSimilarity<NgramDistanceImpl<4, UInt8, false, false>, NameNgramDistance>;
|
struct NameNgramEntry
|
||||||
using FunctionNgramDistanceCaseInsensitive = FunctionsStringSimilarity<NgramDistanceImpl<4, UInt8, false, true>, NameNgramDistanceCaseInsensitive>;
|
{
|
||||||
using FunctionNgramDistanceUTF8 = FunctionsStringSimilarity<NgramDistanceImpl<3, UInt32, true, false>, NameNgramDistanceUTF8>;
|
static constexpr auto name = "ngramEntry";
|
||||||
using FunctionNgramDistanceCaseInsensitiveUTF8 = FunctionsStringSimilarity<NgramDistanceImpl<3, UInt32, true, true>, NameNgramDistanceUTF8CaseInsensitive>;
|
};
|
||||||
|
struct NameNgramEntryCaseInsensitive
|
||||||
|
{
|
||||||
|
static constexpr auto name = "ngramEntryCaseInsensitive";
|
||||||
|
};
|
||||||
|
struct NameNgramEntryUTF8
|
||||||
|
{
|
||||||
|
static constexpr auto name = "ngramEntryUTF8";
|
||||||
|
};
|
||||||
|
|
||||||
|
struct NameNgramEntryUTF8CaseInsensitive
|
||||||
|
{
|
||||||
|
static constexpr auto name = "ngramEntryCaseInsensitiveUTF8";
|
||||||
|
};
|
||||||
|
|
||||||
|
using FunctionNgramDistance = FunctionsStringSimilarity<NgramDistanceImpl<4, UInt8, false, false, true>, NameNgramDistance>;
|
||||||
|
using FunctionNgramDistanceCaseInsensitive = FunctionsStringSimilarity<NgramDistanceImpl<4, UInt8, false, true, true>, NameNgramDistanceCaseInsensitive>;
|
||||||
|
using FunctionNgramDistanceUTF8 = FunctionsStringSimilarity<NgramDistanceImpl<3, UInt32, true, false, true>, NameNgramDistanceUTF8>;
|
||||||
|
using FunctionNgramDistanceCaseInsensitiveUTF8 = FunctionsStringSimilarity<NgramDistanceImpl<3, UInt32, true, true, true>, NameNgramDistanceUTF8CaseInsensitive>;
|
||||||
|
|
||||||
|
using FunctionNgramEntry = FunctionsStringSimilarity<NgramDistanceImpl<4, UInt8, false, false, false>, NameNgramEntry>;
|
||||||
|
using FunctionNgramEntryCaseInsensitive = FunctionsStringSimilarity<NgramDistanceImpl<4, UInt8, false, true, false>, NameNgramEntryCaseInsensitive>;
|
||||||
|
using FunctionNgramEntryUTF8 = FunctionsStringSimilarity<NgramDistanceImpl<3, UInt32, true, false, false>, NameNgramEntryUTF8>;
|
||||||
|
using FunctionNgramEntryCaseInsensitiveUTF8 = FunctionsStringSimilarity<NgramDistanceImpl<3, UInt32, true, true, false>, NameNgramEntryUTF8CaseInsensitive>;
|
||||||
|
|
||||||
|
|
||||||
void registerFunctionsStringSimilarity(FunctionFactory & factory)
|
void registerFunctionsStringSimilarity(FunctionFactory & factory)
|
||||||
{
|
{
|
||||||
@ -418,6 +514,11 @@ void registerFunctionsStringSimilarity(FunctionFactory & factory)
|
|||||||
factory.registerFunction<FunctionNgramDistanceCaseInsensitive>();
|
factory.registerFunction<FunctionNgramDistanceCaseInsensitive>();
|
||||||
factory.registerFunction<FunctionNgramDistanceUTF8>();
|
factory.registerFunction<FunctionNgramDistanceUTF8>();
|
||||||
factory.registerFunction<FunctionNgramDistanceCaseInsensitiveUTF8>();
|
factory.registerFunction<FunctionNgramDistanceCaseInsensitiveUTF8>();
|
||||||
|
|
||||||
|
factory.registerFunction<FunctionNgramEntry>();
|
||||||
|
factory.registerFunction<FunctionNgramEntryCaseInsensitive>();
|
||||||
|
factory.registerFunction<FunctionNgramEntryUTF8>();
|
||||||
|
factory.registerFunction<FunctionNgramEntryCaseInsensitiveUTF8>();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -110,15 +110,15 @@ public:
|
|||||||
}
|
}
|
||||||
else if (col_haystack_const && col_needle_vector)
|
else if (col_haystack_const && col_needle_vector)
|
||||||
{
|
{
|
||||||
const String & needle = col_haystack_const->getValue<String>();
|
const String & haystack = col_haystack_const->getValue<String>();
|
||||||
if (needle.size() > Impl::max_string_size)
|
if (haystack.size() > Impl::max_string_size)
|
||||||
{
|
{
|
||||||
throw Exception(
|
throw Exception(
|
||||||
"String size of needle is too big for function " + getName() + ". Should be at most "
|
"String size of haystack is too big for function " + getName() + ". Should be at most "
|
||||||
+ std::to_string(Impl::max_string_size),
|
+ std::to_string(Impl::max_string_size),
|
||||||
ErrorCodes::TOO_LARGE_STRING_SIZE);
|
ErrorCodes::TOO_LARGE_STRING_SIZE);
|
||||||
}
|
}
|
||||||
Impl::vector_constant(col_needle_vector->getChars(), col_needle_vector->getOffsets(), needle, vec_res);
|
Impl::constant_vector(haystack, col_needle_vector->getChars(), col_needle_vector->getOffsets(), vec_res);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -376,11 +376,11 @@ http://metrica.yandex.com/ 1000
|
|||||||
http://metris.ru/ 1000
|
http://metris.ru/ 1000
|
||||||
http://metrika.ru/ 1000
|
http://metrika.ru/ 1000
|
||||||
1000
|
1000
|
||||||
привет как дела?... Херсон 676
|
привет как дела?... Херсон 459
|
||||||
пап привет как дела - Яндекс.Видео 733
|
пап привет как дела - Яндекс.Видео 511
|
||||||
привет как дела клип - Яндекс.Видео 739
|
привет 529
|
||||||
привет братан как дела - Яндекс.Видео 750
|
привет как дела клип - Яндекс.Видео 565
|
||||||
привет 882
|
привет братан как дела - Яндекс.Видео 583
|
||||||
http://metric.ru/ 1000
|
http://metric.ru/ 1000
|
||||||
http://autometric.ru/ 1000
|
http://autometric.ru/ 1000
|
||||||
http://metrica.yandex.com/ 1000
|
http://metrica.yandex.com/ 1000
|
||||||
@ -453,11 +453,11 @@ http://autometric.ru/ 1000
|
|||||||
http://metris.ru/ 1000
|
http://metris.ru/ 1000
|
||||||
http://metrika.ru/ 1000
|
http://metrika.ru/ 1000
|
||||||
1000
|
1000
|
||||||
привет как дела клип - Яндекс.Видео 182
|
привет как дела клип - Яндекс.Видео 0
|
||||||
пап привет как дела - Яндекс.Видео 354
|
пап привет как дела - Яндекс.Видео 169
|
||||||
привет братан как дела - Яндекс.Видео 382
|
привет братан как дела - Яндекс.Видео 235
|
||||||
привет как дела?... Херсон 649
|
привет как дела?... Херсон 544
|
||||||
привет 838
|
привет 784
|
||||||
http://metric.ru/ 1000
|
http://metric.ru/ 1000
|
||||||
http://autometric.ru/ 1000
|
http://autometric.ru/ 1000
|
||||||
http://metrica.yandex.com/ 1000
|
http://metrica.yandex.com/ 1000
|
||||||
|
855
dbms/tests/queries/0_stateless/00951_ngram_entry.reference
Normal file
855
dbms/tests/queries/0_stateless/00951_ngram_entry.reference
Normal file
@ -0,0 +1,855 @@
|
|||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
500
|
||||||
|
500
|
||||||
|
500
|
||||||
|
500
|
||||||
|
500
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
0
|
||||||
|
0
|
||||||
|
1000
|
||||||
|
0
|
||||||
|
0
|
||||||
|
500
|
||||||
|
1000
|
||||||
|
привет как дела?... Херсон 0
|
||||||
|
привет как дела клип - Яндекс.Видео 0
|
||||||
|
привет 0
|
||||||
|
пап привет как дела - Яндекс.Видео 0
|
||||||
|
привет братан как дела - Яндекс.Видео 0
|
||||||
|
http://metric.ru/ 0
|
||||||
|
http://autometric.ru/ 0
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
http://metris.ru/ 0
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
0
|
||||||
|
привет как дела?... Херсон 0
|
||||||
|
привет как дела клип - Яндекс.Видео 0
|
||||||
|
привет 0
|
||||||
|
пап привет как дела - Яндекс.Видео 0
|
||||||
|
привет братан как дела - Яндекс.Видео 0
|
||||||
|
http://metric.ru/ 0
|
||||||
|
http://autometric.ru/ 0
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
http://metris.ru/ 0
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
0
|
||||||
|
привет как дела?... Херсон 0
|
||||||
|
привет как дела клип - Яндекс.Видео 0
|
||||||
|
привет 0
|
||||||
|
пап привет как дела - Яндекс.Видео 0
|
||||||
|
привет братан как дела - Яндекс.Видео 0
|
||||||
|
http://metric.ru/ 0
|
||||||
|
http://autometric.ru/ 0
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
http://metris.ru/ 0
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
0
|
||||||
|
привет как дела?... Херсон 0
|
||||||
|
привет как дела клип - Яндекс.Видео 0
|
||||||
|
пап привет как дела - Яндекс.Видео 0
|
||||||
|
привет братан как дела - Яндекс.Видео 77
|
||||||
|
привет 692
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metrica.yandex.com/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
пап привет как дела - Яндекс.Видео 154
|
||||||
|
привет как дела?... Херсон 231
|
||||||
|
привет как дела клип - Яндекс.Видео 231
|
||||||
|
привет братан как дела - Яндекс.Видео 231
|
||||||
|
привет 692
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metrica.yandex.com/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
http://metric.ru/ 400
|
||||||
|
http://autometric.ru/ 400
|
||||||
|
http://metrica.yandex.com/ 400
|
||||||
|
http://metris.ru/ 400
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
http://metric.ru/ 200
|
||||||
|
http://autometric.ru/ 200
|
||||||
|
http://metris.ru/ 400
|
||||||
|
http://metrika.ru/ 400
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrika.ru/ 200
|
||||||
|
http://metric.ru/ 400
|
||||||
|
http://autometric.ru/ 400
|
||||||
|
http://metrica.yandex.com/ 400
|
||||||
|
http://metris.ru/ 400
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metric.ru/ 200
|
||||||
|
http://autometric.ru/ 200
|
||||||
|
http://metrica.yandex.com/ 200
|
||||||
|
http://metris.ru/ 400
|
||||||
|
http://metrika.ru/ 400
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
500
|
||||||
|
500
|
||||||
|
500
|
||||||
|
500
|
||||||
|
500
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
0
|
||||||
|
0
|
||||||
|
1000
|
||||||
|
429
|
||||||
|
0
|
||||||
|
500
|
||||||
|
1000
|
||||||
|
привет как дела?... Херсон 0
|
||||||
|
привет как дела клип - Яндекс.Видео 0
|
||||||
|
привет 0
|
||||||
|
пап привет как дела - Яндекс.Видео 0
|
||||||
|
привет братан как дела - Яндекс.Видео 0
|
||||||
|
http://metric.ru/ 0
|
||||||
|
http://autometric.ru/ 0
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
http://metris.ru/ 0
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
0
|
||||||
|
привет как дела?... Херсон 0
|
||||||
|
привет как дела клип - Яндекс.Видео 0
|
||||||
|
привет 0
|
||||||
|
пап привет как дела - Яндекс.Видео 0
|
||||||
|
привет братан как дела - Яндекс.Видео 0
|
||||||
|
http://metric.ru/ 0
|
||||||
|
http://autometric.ru/ 0
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
http://metris.ru/ 0
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
0
|
||||||
|
привет как дела?... Херсон 0
|
||||||
|
привет как дела клип - Яндекс.Видео 0
|
||||||
|
привет 0
|
||||||
|
пап привет как дела - Яндекс.Видео 0
|
||||||
|
привет братан как дела - Яндекс.Видео 0
|
||||||
|
http://metric.ru/ 0
|
||||||
|
http://autometric.ru/ 0
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
http://metris.ru/ 0
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
0
|
||||||
|
привет как дела?... Херсон 0
|
||||||
|
привет как дела клип - Яндекс.Видео 0
|
||||||
|
пап привет как дела - Яндекс.Видео 0
|
||||||
|
привет братан как дела - Яндекс.Видео 77
|
||||||
|
привет 692
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metrica.yandex.com/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
пап привет как дела - Яндекс.Видео 154
|
||||||
|
привет как дела?... Херсон 231
|
||||||
|
привет как дела клип - Яндекс.Видео 231
|
||||||
|
привет братан как дела - Яндекс.Видео 231
|
||||||
|
привет 692
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metrica.yandex.com/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
http://metric.ru/ 400
|
||||||
|
http://autometric.ru/ 400
|
||||||
|
http://metrica.yandex.com/ 400
|
||||||
|
http://metris.ru/ 400
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
http://metric.ru/ 400
|
||||||
|
http://autometric.ru/ 400
|
||||||
|
http://metrica.yandex.com/ 400
|
||||||
|
http://metris.ru/ 400
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
http://metric.ru/ 200
|
||||||
|
http://autometric.ru/ 200
|
||||||
|
http://metris.ru/ 400
|
||||||
|
http://metrika.ru/ 400
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrika.ru/ 200
|
||||||
|
http://metric.ru/ 400
|
||||||
|
http://autometric.ru/ 400
|
||||||
|
http://metrica.yandex.com/ 400
|
||||||
|
http://metris.ru/ 400
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metric.ru/ 200
|
||||||
|
http://autometric.ru/ 200
|
||||||
|
http://metrica.yandex.com/ 200
|
||||||
|
http://metris.ru/ 400
|
||||||
|
http://metrika.ru/ 400
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
привет как дела клип - Яндекс.Видео 0
|
||||||
|
пап привет как дела - Яндекс.Видео 182
|
||||||
|
привет братан как дела - Яндекс.Видео 212
|
||||||
|
привет как дела?... Херсон 606
|
||||||
|
привет 879
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metrica.yandex.com/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
привет как дела?... Херсон 0
|
||||||
|
привет как дела клип - Яндекс.Видео 0
|
||||||
|
пап привет как дела - Яндекс.Видео 0
|
||||||
|
привет братан как дела - Яндекс.Видео 40
|
||||||
|
привет 640
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metrica.yandex.com/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
пап привет как дела - Яндекс.Видео 80
|
||||||
|
привет как дела?... Херсон 120
|
||||||
|
привет как дела клип - Яндекс.Видео 120
|
||||||
|
привет братан как дела - Яндекс.Видео 120
|
||||||
|
привет 640
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metrica.yandex.com/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
http://metric.ru/ 500
|
||||||
|
http://autometric.ru/ 500
|
||||||
|
http://metrica.yandex.com/ 500
|
||||||
|
http://metris.ru/ 500
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
http://metric.ru/ 250
|
||||||
|
http://autometric.ru/ 250
|
||||||
|
http://metris.ru/ 500
|
||||||
|
http://metrika.ru/ 500
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrika.ru/ 250
|
||||||
|
http://metric.ru/ 500
|
||||||
|
http://autometric.ru/ 500
|
||||||
|
http://metrica.yandex.com/ 500
|
||||||
|
http://metris.ru/ 500
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metric.ru/ 250
|
||||||
|
http://autometric.ru/ 250
|
||||||
|
http://metrica.yandex.com/ 250
|
||||||
|
http://metris.ru/ 500
|
||||||
|
http://metrika.ru/ 500
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1000
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
привет как дела?... Херсон 880
|
||||||
|
привет как дела клип - Яндекс.Видео 880
|
||||||
|
пап привет как дела - Яндекс.Видео 880
|
||||||
|
привет братан как дела - Яндекс.Видео 920
|
||||||
|
привет 1000
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metrica.yandex.com/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
привет как дела?... Херсон 560
|
||||||
|
привет как дела клип - Яндекс.Видео 560
|
||||||
|
пап привет как дела - Яндекс.Видео 560
|
||||||
|
привет братан как дела - Яндекс.Видео 560
|
||||||
|
привет 1000
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metrica.yandex.com/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
http://metric.ru/ 500
|
||||||
|
http://autometric.ru/ 500
|
||||||
|
http://metrica.yandex.com/ 500
|
||||||
|
http://metris.ru/ 500
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrika.ru/ 0
|
||||||
|
http://metric.ru/ 500
|
||||||
|
http://autometric.ru/ 500
|
||||||
|
http://metrica.yandex.com/ 500
|
||||||
|
http://metris.ru/ 500
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
http://metric.ru/ 250
|
||||||
|
http://autometric.ru/ 250
|
||||||
|
http://metris.ru/ 500
|
||||||
|
http://metrika.ru/ 500
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrika.ru/ 250
|
||||||
|
http://metric.ru/ 500
|
||||||
|
http://autometric.ru/ 500
|
||||||
|
http://metrica.yandex.com/ 500
|
||||||
|
http://metris.ru/ 500
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metric.ru/ 250
|
||||||
|
http://autometric.ru/ 250
|
||||||
|
http://metrica.yandex.com/ 250
|
||||||
|
http://metris.ru/ 500
|
||||||
|
http://metrika.ru/ 500
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
1000
|
||||||
|
http://metrica.yandex.com/ 0
|
||||||
|
привет как дела?... Херсон 1000
|
||||||
|
привет как дела клип - Яндекс.Видео 1000
|
||||||
|
привет 1000
|
||||||
|
пап привет как дела - Яндекс.Видео 1000
|
||||||
|
привет братан как дела - Яндекс.Видео 1000
|
||||||
|
http://metric.ru/ 1000
|
||||||
|
http://autometric.ru/ 1000
|
||||||
|
http://metris.ru/ 1000
|
||||||
|
http://metrika.ru/ 1000
|
||||||
|
1000
|
180
dbms/tests/queries/0_stateless/00951_ngram_entry.sql
Normal file
180
dbms/tests/queries/0_stateless/00951_ngram_entry.sql
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
select round(1000 * ngramEntryUTF8(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize('абв'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize(''), 'абв')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'абвгдеёжз')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'абвгдеёж')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'гдеёзд')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'ёёёёёёёё')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize(''), materialize('')))=round(1000 * ngramEntryUTF8(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize('абв'), materialize('')))=round(1000 * ngramEntryUTF8(materialize('абв'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize(''), materialize('абв')))=round(1000 * ngramEntryUTF8(materialize(''), 'абв')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), materialize('абвгдеёжз')))=round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'абвгдеёжз')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), materialize('абвгдеёж')))=round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'абвгдеёж')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), materialize('гдеёзд')))=round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'гдеёзд')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), materialize('ёёёёёёёё')))=round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'ёёёёёёёё')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryUTF8('', materialize('')))=round(1000 * ngramEntryUTF8(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8('абв', materialize('')))=round(1000 * ngramEntryUTF8(materialize('абв'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8('', materialize('абв')))=round(1000 * ngramEntryUTF8(materialize(''), 'абв')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8('абвгдеёжз', materialize('абвгдеёжз')))=round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'абвгдеёжз')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8('абвгдеёжз', materialize('абвгдеёж')))=round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'абвгдеёж')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8('абвгдеёжз', materialize('гдеёзд')))=round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'гдеёзд')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryUTF8('абвгдеёжз', materialize('ёёёёёёёё')))=round(1000 * ngramEntryUTF8(materialize('абвгдеёжз'), 'ёёёёёёёё')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryUTF8('', ''));
|
||||||
|
select round(1000 * ngramEntryUTF8('абв', ''));
|
||||||
|
select round(1000 * ngramEntryUTF8('', 'абв'));
|
||||||
|
select round(1000 * ngramEntryUTF8('абвгдеёжз', 'абвгдеёжз'));
|
||||||
|
select round(1000 * ngramEntryUTF8('абвгдеёжз', 'абвгдеёж'));
|
||||||
|
select round(1000 * ngramEntryUTF8('абвгдеёжз', 'гдеёзд'));
|
||||||
|
select round(1000 * ngramEntryUTF8('абвгдеёжз', 'ёёёёёёёё'));
|
||||||
|
|
||||||
|
drop table if exists test_entry_distance;
|
||||||
|
create table test_entry_distance (Title String) engine = Memory;
|
||||||
|
insert into test_entry_distance values ('привет как дела?... Херсон'), ('привет как дела клип - Яндекс.Видео'), ('привет'), ('пап привет как дела - Яндекс.Видео'), ('привет братан как дела - Яндекс.Видео'), ('http://metric.ru/'), ('http://autometric.ru/'), ('http://metrica.yandex.com/'), ('http://metris.ru/'), ('http://metrika.ru/'), ('');
|
||||||
|
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryUTF8(Title, Title) as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryUTF8(Title, extract(Title, 'как дела')) as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryUTF8(Title, extract(Title, 'metr')) as distance;
|
||||||
|
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryUTF8(Title, 'привет как дела') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryUTF8(Title, 'как привет дела') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryUTF8(Title, 'metrika') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryUTF8(Title, 'metrica') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryUTF8(Title, 'metriks') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryUTF8(Title, 'metrics') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryUTF8(Title, 'yandex') as distance;
|
||||||
|
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абв'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize(''), 'абв')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвГДЕёжз'), 'АбвгдЕёжз')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('аБВГдеёЖз'), 'АбвГдеёж')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвгдеёжз'), 'гдеёЗД')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвгдеёжз'), 'ЁЁЁЁЁЁЁЁ')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize(''),materialize(''))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абв'),materialize(''))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абв'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize(''), materialize('абв'))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize(''), 'абв')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвГДЕёжз'), materialize('АбвгдЕёжз'))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвГДЕёжз'), 'АбвгдЕёжз')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('аБВГдеёЖз'), materialize('АбвГдеёж'))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('аБВГдеёЖз'), 'АбвГдеёж')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвгдеёжз'), materialize('гдеёЗД'))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвгдеёжз'), 'гдеёЗД')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвгдеёжз'), materialize('ЁЁЁЁЁЁЁЁ'))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвгдеёжз'), 'ЁЁЁЁЁЁЁЁ')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('', materialize(''))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('абв',materialize(''))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абв'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('', materialize('абв'))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize(''), 'абв')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('абвГДЕёжз', materialize('АбвгдЕёжз'))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвГДЕёжз'), 'АбвгдЕёжз')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('аБВГдеёЖз', materialize('АбвГдеёж'))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('аБВГдеёЖз'), 'АбвГдеёж')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('абвгдеёжз', materialize('гдеёЗД'))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвгдеёжз'), 'гдеёЗД')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('абвгдеёжз', materialize('ЁЁЁЁЁЁЁЁ'))) = round(1000 * ngramEntryCaseInsensitiveUTF8(materialize('абвгдеёжз'), 'ЁЁЁЁЁЁЁЁ')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('', ''));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('абв', ''));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('', 'абв'));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('абвГДЕёжз', 'АбвгдЕЁжз'));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('аБВГдеёЖз', 'АбвГдеёж'));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('абвгдеёжз', 'гдеёЗД'));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitiveUTF8('АБВГДеёжз', 'ЁЁЁЁЁЁЁЁ'));
|
||||||
|
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, Title) as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, extract(Title, 'как дела')) as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, extract(Title, 'metr')) as distance;
|
||||||
|
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, 'ПрИвЕт кАК ДЕЛа') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, 'как ПРИВЕТ дела') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, 'metrika') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, 'Metrika') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, 'mEtrica') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, 'metriKS') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, 'metrics') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, 'YanDEX') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitiveUTF8(Title, 'приВЕТ КАк ДеЛа КлИп - яндеКс.видео') as distance;
|
||||||
|
|
||||||
|
|
||||||
|
select round(1000 * ngramEntry(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize('abc'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize(''), 'abc')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize('abcdefgh'), 'abcdefgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize('abcdefgh'), 'abcdefg')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize('abcdefgh'), 'defgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize('abcdefgh'), 'aaaaaaaa')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntry(materialize(''),materialize('')))=round(1000 * ngramEntry(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize('abc'),materialize('')))=round(1000 * ngramEntry(materialize('abc'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize(''), materialize('abc')))=round(1000 * ngramEntry(materialize(''), 'abc')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize('abcdefgh'), materialize('abcdefgh')))=round(1000 * ngramEntry(materialize('abcdefgh'), 'abcdefgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize('abcdefgh'), materialize('abcdefg')))=round(1000 * ngramEntry(materialize('abcdefgh'), 'abcdefg')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize('abcdefgh'), materialize('defgh')))=round(1000 * ngramEntry(materialize('abcdefgh'), 'defgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry(materialize('abcdefgh'), materialize('aaaaaaaa')))=round(1000 * ngramEntry(materialize('abcdefgh'), 'aaaaaaaa')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntry('',materialize('')))=round(1000 * ngramEntry(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry('abc', materialize('')))=round(1000 * ngramEntry(materialize('abc'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry('', materialize('abc')))=round(1000 * ngramEntry(materialize(''), 'abc')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry('abcdefgh', materialize('abcdefgh')))=round(1000 * ngramEntry(materialize('abcdefgh'), 'abcdefgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry('abcdefgh', materialize('abcdefg')))=round(1000 * ngramEntry(materialize('abcdefgh'), 'abcdefg')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry('abcdefgh', materialize('defgh')))=round(1000 * ngramEntry(materialize('abcdefgh'), 'defgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntry('abcdefgh', materialize('aaaaaaaa')))=round(1000 * ngramEntry(materialize('abcdefgh'), 'aaaaaaaa')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
|
||||||
|
select round(1000 * ngramEntry('', ''));
|
||||||
|
select round(1000 * ngramEntry('abc', ''));
|
||||||
|
select round(1000 * ngramEntry('', 'abc'));
|
||||||
|
select round(1000 * ngramEntry('abcdefgh', 'abcdefgh'));
|
||||||
|
select round(1000 * ngramEntry('abcdefgh', 'abcdefg'));
|
||||||
|
select round(1000 * ngramEntry('abcdefgh', 'defgh'));
|
||||||
|
select round(1000 * ngramEntry('abcdefghaaaaaaaaaa', 'aaaaaaaa'));
|
||||||
|
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntry(Title, 'привет как дела') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntry(Title, 'как привет дела') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntry(Title, 'metrika') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntry(Title, 'metrica') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntry(Title, 'metriks') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntry(Title, 'metrics') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntry(Title, 'yandex') as distance;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize('abc'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize(''), 'abc')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize('abCdefgH'), 'Abcdefgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize('abcdefgh'), 'abcdeFG')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize('AAAAbcdefgh'), 'defgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize('ABCdefgH'), 'aaaaaaaa')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize(''), materialize('')))=round(1000 * ngramEntryCaseInsensitive(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize('abc'), materialize('')))=round(1000 * ngramEntryCaseInsensitive(materialize('abc'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize(''), materialize('abc')))=round(1000 * ngramEntryCaseInsensitive(materialize(''), 'abc')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize('abCdefgH'), materialize('Abcdefgh')))=round(1000 * ngramEntryCaseInsensitive(materialize('abCdefgH'), 'Abcdefgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize('abcdefgh'), materialize('abcdeFG')))=round(1000 * ngramEntryCaseInsensitive(materialize('abcdefgh'), 'abcdeFG')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize('AAAAbcdefgh'), materialize('defgh')))=round(1000 * ngramEntryCaseInsensitive(materialize('AAAAbcdefgh'), 'defgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive(materialize('ABCdefgH'), materialize('aaaaaaaa')))=round(1000 * ngramEntryCaseInsensitive(materialize('ABCdefgH'), 'aaaaaaaa')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('', materialize('')))=round(1000 * ngramEntryCaseInsensitive(materialize(''), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('abc', materialize('')))=round(1000 * ngramEntryCaseInsensitive(materialize('abc'), '')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('', materialize('abc')))=round(1000 * ngramEntryCaseInsensitive(materialize(''), 'abc')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('abCdefgH', materialize('Abcdefgh')))=round(1000 * ngramEntryCaseInsensitive(materialize('abCdefgH'), 'Abcdefgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('abcdefgh', materialize('abcdeFG')))=round(1000 * ngramEntryCaseInsensitive(materialize('abcdefgh'), 'abcdeFG')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('AAAAbcdefgh', materialize('defgh')))=round(1000 * ngramEntryCaseInsensitive(materialize('AAAAbcdefgh'), 'defgh')) from system.numbers limit 5;
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('ABCdefgH', materialize('aaaaaaaa')))=round(1000 * ngramEntryCaseInsensitive(materialize('ABCdefgH'), 'aaaaaaaa')) from system.numbers limit 5;
|
||||||
|
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('', ''));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('abc', ''));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('', 'abc'));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('abCdefgH', 'Abcdefgh'));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('abcdefgh', 'abcdeFG'));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('AAAAbcdefgh', 'defgh'));
|
||||||
|
select round(1000 * ngramEntryCaseInsensitive('ABCdefgHaAaaaAaaaAA', 'aaaaaaaa'));
|
||||||
|
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitive(Title, 'ПрИвЕт кАК ДЕЛа') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitive(Title, 'как ПРИВЕТ дела') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitive(Title, 'metrika') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitive(Title, 'Metrika') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitive(Title, 'mEtrica') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitive(Title, 'metriKS') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitive(Title, 'metrics') as distance;
|
||||||
|
SELECT Title, round(1000 * distance) FROM test_entry_distance ORDER BY ngramEntryCaseInsensitive(Title, 'YanDEX') as distance;
|
||||||
|
|
||||||
|
drop table if exists test_entry_distance;
|
@ -106,7 +106,12 @@ Calculates the 4-gram distance between `haystack` and `needle`: counts the symme
|
|||||||
|
|
||||||
For case-insensitive search or/and in UTF-8 format use functions `ngramDistanceCaseInsensitive, ngramDistanceUTF8, ngramDistanceCaseInsensitiveUTF8`.
|
For case-insensitive search or/and in UTF-8 format use functions `ngramDistanceCaseInsensitive, ngramDistanceUTF8, ngramDistanceCaseInsensitiveUTF8`.
|
||||||
|
|
||||||
**Note: For UTF-8 case we use 3-gram distance. All these are not perfectly fair n-gram distances. We use 2-byte hashes to hash n-grams and then calculate the symmetric difference between these hash tables -- collisions may occur. With UTF-8 case-insensitive format we do not use fair `tolower` function -- we zero the 5-th bit (starting from zero) of each codepoint byte -- this works for Latin and mostly for all Cyrillic letters.**
|
## ngramEntry(haystack, needle)
|
||||||
|
|
||||||
|
Same as `ngramDistance` but calculates the non-symmetric difference between `needle` and `haystack` -- the number of n-grams from needle minus the common number of n-grams normalized by the number of `needle` n-grams. Can be useful for fuzzy string search.
|
||||||
|
|
||||||
|
For case-insensitive search or/and in UTF-8 format use functions `ngramEntryCaseInsensitive, ngramEntryUTF8, ngramEntryCaseInsensitiveUTF8`.
|
||||||
|
|
||||||
|
**Note: For UTF-8 case we use 3-gram distance. All these are not perfectly fair n-gram distances. We use 2-byte hashes to hash n-grams and then calculate the (non-)symmetric difference between these hash tables -- collisions may occur. With UTF-8 case-insensitive format we do not use fair `tolower` function -- we zero the 5-th bit (starting from zero) of each codepoint byte and first bit of zeroth byte if bytes more than one -- this works for Latin and mostly for all Cyrillic letters.**
|
||||||
|
|
||||||
[Original article](https://clickhouse.yandex/docs/en/query_language/functions/string_search_functions/) <!--hide-->
|
[Original article](https://clickhouse.yandex/docs/en/query_language/functions/string_search_functions/) <!--hide-->
|
||||||
|
@ -95,6 +95,13 @@
|
|||||||
|
|
||||||
Для поиска без учета регистра и/или в формате UTF-8 используйте функции `ngramDistanceCaseInsensitive, ngramDistanceUTF8, ngramDistanceCaseInsensitiveUTF8`.
|
Для поиска без учета регистра и/или в формате UTF-8 используйте функции `ngramDistanceCaseInsensitive, ngramDistanceUTF8, ngramDistanceCaseInsensitiveUTF8`.
|
||||||
|
|
||||||
**Примечание: для случая UTF-8 мы используем триграммное расстояние. Вычисление n-граммного расстояния не совсем честное. Мы используем 2-х байтные хэши для хэширования n-грамм, а затем вычисляем симметричную разность между хэш таблицами -- могут возникнуть коллизии. В формате UTF-8 без учета регистра мы не используем честную функцию `tolower` -- мы обнуляем 5-й бит (нумерация с нуля) каждого байта кодовой точки -- это работает для латиницы и почти для всех кириллических букв.**
|
## ngramEntry(haystack, needle)
|
||||||
|
|
||||||
|
То же, что и `ngramDistance`, но вычисляет несимметричную разность между `needle` и `haystack` -- количество n-грамм из `needle` минус количество общих n-грамм, нормированное на количество n-грамм из `needle`. Может быть использовано для приближенного поиска.
|
||||||
|
|
||||||
|
Для поиска без учета регистра и/или в формате UTF-8 используйте функции `ngramEntryCaseInsensitive, ngramEntryUTF8, ngramEntryCaseInsensitiveUTF8`.
|
||||||
|
|
||||||
|
|
||||||
|
**Примечание: для случая UTF-8 мы используем триграммное расстояние. Вычисление n-граммного расстояния не совсем честное. Мы используем 2-х байтные хэши для хэширования n-грамм, а затем вычисляем (не)симметрическую разность между хэш таблицами -- могут возникнуть коллизии. В формате UTF-8 без учета регистра мы не используем честную функцию `tolower` -- мы обнуляем 5-й бит (нумерация с нуля) каждого байта кодовой точки, а также первый бит нулевого байта, если байтов больше 1 -- это работает для латиницы и почти для всех кириллических букв.**
|
||||||
|
|
||||||
[Оригинальная статья](https://clickhouse.yandex/docs/ru/query_language/functions/string_search_functions/) <!--hide-->
|
[Оригинальная статья](https://clickhouse.yandex/docs/ru/query_language/functions/string_search_functions/) <!--hide-->
|
||||||
|
Loading…
Reference in New Issue
Block a user