uni-app 字符串过长时模糊查询匹配不到结果
uni-app 字符串过长时模糊查询匹配不到结果
示例代码:
[
{
"_id": "6738846ca674f4d0a393d125",
"add_date": 1731757163864,
"category_id": 2,
"department": "665b321cee97ef58965c557e",
"goods_id": "672f015f189f8669f3a99123",
"goods_name": "而在吗测试",
"last_modify_date": 1731757163864,
"market_price": 0,
"model": "cbe8423dbc2f8d419b1cd90e",
"model_in": "2222222222222222222222222222",
"model_out": "333333333333333333333333333",
"orderStatus": 1
}
]
db.collection('opendb-mall-sku').where(`${new RegExp('2', 'i')}.test(model)`).get()
操作步骤:
db.collection('opendb-mall-sku').where(`${new RegExp('2', 'i')}.test(model)`).get()
预期结果:
[
{
"_id": "6738846ca674f4d0a393d125",
"add_date": 1731757163864,
"category_id": 2,
"department": "665b321cee97ef58965c557e",
"goods_id": "672f015f189f8669f3a99123",
"goods_name": "而在吗测试",
"last_modify_date": 1731757163864,
"market_price": 0,
"model": "cbe8423dbc2f8d419b1cd90e",
"model_in": "2222222222222222222222222222",
"model_out": "333333333333333333333333333",
"orderStatus": 1
}
]
实际结果:
[]
bug描述:
以下是表中某行数据
[
{
"_id": "6738846ca674f4d0a393d125",
"add_date": 1731757163864,
"category_id": 2,
"department": "665b321cee97ef58965c557e",
"goods_id": "672f015f189f8669f3a99123",
"goods_name": "而在吗测试",
"last_modify_date": 1731757163864,
"market_price": 0,
"model": "cbe8423dbc2f8d419b1cd90e",
"model_in": "2222222222222222222222222222",
"model_out": "333333333333333333333333333",
"orderStatus": 1
}
]
以下是查询方法
db.collection('opendb-mall-sku').where(`${new RegExp('2', 'i')}.test(model)`).get()
当model
字段字母数字混合长度大于24个时,模糊查询结果为空,小于等于24个,查询正常
2 回复
你再试下,是否只有刚好24位的不能模糊查询
已知24位会转ObjectId,此时不是字符串,故不能模糊查询
在uni-app中处理字符串过长时的模糊查询问题,可以通过多种方式优化查询逻辑,以确保即使字符串很长也能正确匹配到结果。以下是一个使用正则表达式和字符串处理的代码示例,帮助你实现高效的模糊查询。
示例场景
假设你有一个包含长字符串的数组,并且用户输入一个关键词进行模糊查询。
解决方案
-
正则表达式优化查询: 使用正则表达式进行模糊匹配,同时利用正则表达式的
ignoreCase
和global
标志来提高搜索效率。 -
字符串预处理: 在查询之前,可以对长字符串进行预处理,比如分词或提取关键词,以减少匹配时的计算量。
代码示例
// 示例数据:长字符串数组
const longStrings = [
"This is a very long string that contains multiple words and phrases that might be relevant for search.",
"Another long string with different content, but similar words might appear multiple times.",
// 更多长字符串...
];
// 用户输入的查询关键词
const searchKeyword = "multiple";
// 模糊查询函数
function fuzzySearch(strings, keyword) {
// 构建正则表达式,使用全局和忽略大小写的标志
const regex = new RegExp(keyword, 'gi');
// 过滤匹配到的字符串
const result = strings.filter(str => regex.test(str));
return result;
}
// 调用模糊查询函数
const matchedStrings = fuzzySearch(longStrings, searchKeyword);
// 输出匹配结果
console.log("Matched Strings:", matchedStrings);
// 如果需要更高效的搜索(特别是在大数据集上),可以考虑使用索引或数据库
// 例如,使用Lucene、Elasticsearch等搜索引擎进行模糊查询
// 另一种优化方法:预处理字符串(例如,分词)
function preprocessString(str) {
// 简单的分词处理(这里只是分割单词作为示例)
return str.toLowerCase().split(/\s+/);
}
// 对每个长字符串进行预处理,并存储分词结果(实际应用中可能需要更复杂的分词逻辑)
const processedStrings = longStrings.map(str => preprocessString(str));
// 在分词结果中搜索(这里只是简单示例,实际应用可能需要更复杂的匹配逻辑)
const fastSearch = (processed, keyword) =>
processed.filter(words => words.includes(keyword.toLowerCase()));
const fastMatchedStrings = fastSearch(processedStrings, searchKeyword);
console.log("Fast Matched Strings:", fastMatchedStrings.map((_, index) => longStrings[index]));
注意事项
- 上述代码中的分词处理只是简单示例,实际应用中可能需要使用更复杂的分词算法或库。
- 对于非常大的数据集,考虑使用专门的搜索引擎或数据库索引来提高查询效率。
- 模糊查询的性能会随数据集大小的增加而下降,因此需要根据具体情况选择合适的优化策略。