mirror of
https://github.com/godotengine/godot-question2answer.git
synced 2026-01-01 01:48:37 +03:00
This project lived only on the server without version control. This is now the starting point for the repository.
135 lines
4.3 KiB
PHP
135 lines
4.3 KiB
PHP
<?php
|
|
/*
|
|
Question2Answer by Gideon Greenspan and contributors
|
|
http://www.question2answer.org/
|
|
|
|
Description: Basic module for indexing and searching Q2A posts
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
More about this license: http://www.question2answer.org/license.php
|
|
*/
|
|
|
|
class qa_search_basic
|
|
{
|
|
public function index_post($postid, $type, $questionid, $parentid, $title, $content, $format, $text, $tagstring, $categoryid)
|
|
{
|
|
require_once QA_INCLUDE_DIR . 'db/post-create.php';
|
|
|
|
// Get words from each textual element
|
|
|
|
$titlewords = array_unique(qa_string_to_words($title));
|
|
$contentcount = array_count_values(qa_string_to_words($text));
|
|
$tagwords = array_unique(qa_string_to_words($tagstring));
|
|
$wholetags = array_unique(qa_tagstring_to_tags($tagstring));
|
|
|
|
// Map all words to their word IDs
|
|
|
|
$words = array_unique(array_merge($titlewords, array_keys($contentcount), $tagwords, $wholetags));
|
|
$wordtoid = qa_db_word_mapto_ids_add($words);
|
|
|
|
// Add to title words index
|
|
|
|
$titlewordids = qa_array_filter_by_keys($wordtoid, $titlewords);
|
|
qa_db_titlewords_add_post_wordids($postid, $titlewordids);
|
|
|
|
// Add to content words index (including word counts)
|
|
|
|
$contentwordidcounts = array();
|
|
foreach ($contentcount as $word => $count) {
|
|
if (isset($wordtoid[$word]))
|
|
$contentwordidcounts[$wordtoid[$word]] = $count;
|
|
}
|
|
|
|
qa_db_contentwords_add_post_wordidcounts($postid, $type, $questionid, $contentwordidcounts);
|
|
|
|
// Add to tag words index
|
|
|
|
$tagwordids = qa_array_filter_by_keys($wordtoid, $tagwords);
|
|
qa_db_tagwords_add_post_wordids($postid, $tagwordids);
|
|
|
|
// Add to whole tags index
|
|
|
|
$wholetagids = qa_array_filter_by_keys($wordtoid, $wholetags);
|
|
qa_db_posttags_add_post_wordids($postid, $wholetagids);
|
|
|
|
// Update counts cached in database (will be skipped if qa_suspend_update_counts() was called
|
|
|
|
qa_db_word_titlecount_update($titlewordids);
|
|
qa_db_word_contentcount_update(array_keys($contentwordidcounts));
|
|
qa_db_word_tagwordcount_update($tagwordids);
|
|
qa_db_word_tagcount_update($wholetagids);
|
|
}
|
|
|
|
public function unindex_post($postid)
|
|
{
|
|
require_once QA_INCLUDE_DIR . 'db/post-update.php';
|
|
|
|
$titlewordids = qa_db_titlewords_get_post_wordids($postid);
|
|
qa_db_titlewords_delete_post($postid);
|
|
qa_db_word_titlecount_update($titlewordids);
|
|
|
|
$contentwordids = qa_db_contentwords_get_post_wordids($postid);
|
|
qa_db_contentwords_delete_post($postid);
|
|
qa_db_word_contentcount_update($contentwordids);
|
|
|
|
$tagwordids = qa_db_tagwords_get_post_wordids($postid);
|
|
qa_db_tagwords_delete_post($postid);
|
|
qa_db_word_tagwordcount_update($tagwordids);
|
|
|
|
$wholetagids = qa_db_posttags_get_post_wordids($postid);
|
|
qa_db_posttags_delete_post($postid);
|
|
qa_db_word_tagcount_update($wholetagids);
|
|
}
|
|
|
|
public function move_post($postid, $categoryid)
|
|
{
|
|
// for now, the built-in search engine ignores categories
|
|
}
|
|
|
|
public function index_page($pageid, $request, $title, $content, $format, $text)
|
|
{
|
|
// for now, the built-in search engine ignores custom pages
|
|
}
|
|
|
|
public function unindex_page($pageid)
|
|
{
|
|
// for now, the built-in search engine ignores custom pages
|
|
}
|
|
|
|
public function process_search($query, $start, $count, $userid, $absoluteurls, $fullcontent)
|
|
{
|
|
require_once QA_INCLUDE_DIR . 'db/selects.php';
|
|
require_once QA_INCLUDE_DIR . 'util/string.php';
|
|
|
|
$words = qa_string_to_words($query);
|
|
|
|
$questions = qa_db_select_with_pending(
|
|
qa_db_search_posts_selectspec($userid, $words, $words, $words, $words, trim($query), $start, $fullcontent, $count)
|
|
);
|
|
|
|
$results = array();
|
|
|
|
foreach ($questions as $question) {
|
|
qa_search_set_max_match($question, $type, $postid); // to link straight to best part
|
|
|
|
$results[] = array(
|
|
'question' => $question,
|
|
'match_type' => $type,
|
|
'match_postid' => $postid,
|
|
);
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
}
|