gpt4 book ai didi

javascript - Chrome 扩展历史 API 未显示所有结果?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:31:50 26 4
gpt4 key购买 nike

我正在尝试使用 Chrome 扩展历史 API 根据输入的搜索词获取用户的历史记录。但在某些情况下搜索无法正常工作。例如,当我输入术语“bi”时,没有给出任何结果,但是当我搜索“bit”时,给出了一些结果,但不是全部,我通过在 chrome 历史搜索中验证它来检查它,它显示了更多结果。这是历史 API 的工作方式还是我做错了什么?这是我的代码-

window.onload = function() {

function getHistory() {
var list = document.getElementById('list');
var box = document.getElementById("box").value;
if (box === '') {
list.innerHTML = '';
list.innerHTML = list.innerHTML + 'Nothing To Search.';
}
else {
var microseconds = 1000 * 60 * 60 * 24 * 365 * 45;
var start = (new Date).getTime() - microseconds;
chrome.history.search({text: box, startTime: 0, maxResults: 50000}, function(data) {
if(Object.keys(data).length === 0) {
list.innerHTML = '';
list.innerHTML = list.innerHTML + 'Nothing Found.';
}
else {
list.innerHTML = '';
data.forEach(function(page) {
list.innerHTML = list.innerHTML + '<li><p>'+page.title+'</p> <a href='+page.url+' target="_blank"><p>'+page.url+'</p></a></li> <hr>';
});
}
});
}
}

document.getElementById('search').onclick = getHistory;
}

谢谢。

最佳答案

我在编写的扩展程序中看到了相同的行为。这真的很烦人,所以我深入研究了 Chromium 源代码,以找出它真正做了什么来匹配历史结果。

简答:从源代码看来,这种行为是有意为之的,所以如果我们想要检索文本查询的所有匹配项,我们将不得不检索所有历史结果并在 JavaScript 中自行搜索匹配项。另外,不要忘记仔细检查开始/结束时间,并确保您的“maxResults”属性足够大,因为任何这些属性的错误值都可能会给您带来意想不到的结果。

长答案

免责声明:我没有太多的 C++ 经验,所以如果我的评估有误,请纠正。

在使用非空文本查询调用 chrome.history.search 后,最终会调用以下函数(在 history_backend.cc 中)。

    bool URLDatabase::GetTextMatchesWithAlgorithm(
const base::string16& query,
query_parser::MatchingAlgorithm algorithm,
URLRows* results) {
query_parser::QueryNodeVector query_nodes;
query_parser_.ParseQueryNodes(query, algorithm, &query_nodes);

results->clear();
sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
"SELECT" HISTORY_URL_ROW_FIELDS "FROM urls WHERE hidden = 0"));

while (statement.Step()) {
query_parser::QueryWordVector query_words;
base::string16 url = base::i18n::ToLower(statement.ColumnString16(1));
query_parser_.ExtractQueryWords(url, &query_words);
GURL gurl(url);
if (gurl.is_valid()) {
// Decode punycode to match IDN.
base::string16 ascii = base::ASCIIToUTF16(gurl.host());
base::string16 utf = url_formatter::IDNToUnicode(gurl.host());
if (ascii != utf)
query_parser_.ExtractQueryWords(utf, &query_words);
}
base::string16 title = base::i18n::ToLower(statement.ColumnString16(2));
query_parser_.ExtractQueryWords(title, &query_words);

if (query_parser_.DoesQueryMatch(query_words, query_nodes)) {
URLResult info;
FillURLRow(statement, &info);
if (info.url().is_valid())
results->push_back(info);
}
}
return !results->empty();
}

传入此函数的算法 query_parser::MatchingAlgorithm 指的是下面显示的枚举(来自 query_parser.h),据我所知从未明确设置,因此它将是 DEFAULT 值。

enum class MatchingAlgorithm {
// Only words long enough are considered for prefix search. Shorter words are
// considered for exact matches.
DEFAULT,
// All words are considered for a prefix search.
ALWAYS_PREFIX_SEARCH,
};

阅读默认选项上方的评论 -

"Only words long enough are considered for prefix search. Shorter words are considered for exact matches"

算法本身 (query_parser.cc) 将您的文本查询和原始 URL 结果分解为由空格或标点符号分隔的“单词”列表,并检查每对之间的“前缀匹配”。这就解释了为什么如果您的历史记录中有多个页面的 URL 中包含文本“chromium”,那么如果您搜索“hromium”,您将得不到任何结果,但如果您搜索“chro”,则会得到所有结果。

在您的情况下,我认为搜索“bi”不会返回任何结果,因为该算法只查找短期匹配的精确词,这意味着“bi”需要被空格包围或网址/标题中的标点符号。如果你用谷歌搜索“bi”,然后再次查询“bi”的历史记录,就可以确认这一点。谷歌搜索历史项目将被匹配,因为在谷歌搜索的 URL 中,“bi”被标点符号和空格包围:

https://www.google.ca/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=bi

来源

关于javascript - Chrome 扩展历史 API 未显示所有结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35136338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com