add route
Browse files- server/routes.ts +33 -15
server/routes.ts
CHANGED
@@ -397,7 +397,7 @@ function transformWebResultToDocument(result: any, rank: number, query: string):
|
|
397 |
search_type: result.type,
|
398 |
fetched_at: new Date().toISOString()
|
399 |
},
|
400 |
-
relevanceScore: Math.max(0.
|
401 |
rank: rank + 1,
|
402 |
searchQuery: query,
|
403 |
retrievalTime: Math.random() * 0.2 + 0.1,
|
@@ -544,7 +544,7 @@ function transformGitHubRepoToDocument(repo: GitHubRepo, rank: number, query: st
|
|
544 |
created_at: repo.created_at,
|
545 |
updated_at: repo.updated_at
|
546 |
},
|
547 |
-
relevanceScore: Math.max(0.
|
548 |
rank: rank + 1,
|
549 |
searchQuery: query,
|
550 |
retrievalTime: Math.random() * 0.3 + 0.1,
|
@@ -856,14 +856,14 @@ Return format: [4, 21, 23, 2, 7]`;
|
|
856 |
const docIds = JSON.parse(jsonMatch[0]);
|
857 |
console.log(`π― AI extracted document IDs: ${JSON.stringify(docIds)}`);
|
858 |
|
859 |
-
// Get the relevant documents in order
|
860 |
allDocuments = docIds
|
861 |
.map((id: number) => allDocs.find(doc => doc.id === id))
|
862 |
.filter((doc: any) => doc !== undefined)
|
863 |
.slice(0, searchRequest.limit)
|
864 |
.map((doc: any, index: number) => ({
|
865 |
...doc,
|
866 |
-
relevanceScore: 1.0 - (index * 0.1),
|
867 |
rank: index + 1,
|
868 |
snippet: doc.content.substring(0, 200) + '...'
|
869 |
}));
|
@@ -884,10 +884,25 @@ Return format: [4, 21, 23, 2, 7]`;
|
|
884 |
const localResults = await storage.searchDocuments(searchRequest);
|
885 |
allDocuments = localResults.results || [];
|
886 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
887 |
} else {
|
888 |
// Use regular keyword search for other search types
|
889 |
const localResults = await storage.searchDocuments(searchRequest);
|
890 |
-
|
|
|
|
|
|
|
|
|
891 |
}
|
892 |
|
893 |
// Validate URLs in local storage results as well
|
@@ -914,10 +929,9 @@ Return format: [4, 21, 23, 2, 7]`;
|
|
914 |
}
|
915 |
}
|
916 |
|
917 |
-
// If local results
|
918 |
-
|
919 |
-
|
920 |
-
console.log(`Local search returned ${allDocuments.length} results, fetching external sources...`);
|
921 |
|
922 |
// Check if we should search GitHub for code-related queries
|
923 |
const isCodeQuery = searchRequest.query.toLowerCase().includes('python') ||
|
@@ -933,16 +947,16 @@ Return format: [4, 21, 23, 2, 7]`;
|
|
933 |
searchPromises.push(
|
934 |
searchGitHubRepos(searchRequest.query, Math.min(5, searchRequest.limit))
|
935 |
.then(repos => repos.map((repo, index) =>
|
936 |
-
transformGitHubRepoToDocument(repo, index
|
937 |
))
|
938 |
);
|
939 |
}
|
940 |
|
941 |
-
// Always include web search for broader coverage
|
942 |
searchPromises.push(
|
943 |
-
searchWeb(searchRequest.query, Math.min(5, searchRequest.limit
|
944 |
.then(webResults => webResults.map((result, index) =>
|
945 |
-
transformWebResultToDocument(result, index
|
946 |
))
|
947 |
);
|
948 |
|
@@ -950,10 +964,14 @@ Return format: [4, 21, 23, 2, 7]`;
|
|
950 |
const externalResults = await Promise.all(searchPromises);
|
951 |
const flattenedResults = externalResults.flat();
|
952 |
|
953 |
-
//
|
954 |
-
allDocuments =
|
955 |
.sort((a, b) => b.relevanceScore - a.relevanceScore)
|
956 |
.slice(0, searchRequest.limit);
|
|
|
|
|
|
|
|
|
957 |
}
|
958 |
|
959 |
const searchTime = (Date.now() - startTime) / 1000;
|
|
|
397 |
search_type: result.type,
|
398 |
fetched_at: new Date().toISOString()
|
399 |
},
|
400 |
+
relevanceScore: Math.max(0.2, 0.6 - (rank * 0.1)), // Lower scores for external results
|
401 |
rank: rank + 1,
|
402 |
searchQuery: query,
|
403 |
retrievalTime: Math.random() * 0.2 + 0.1,
|
|
|
544 |
created_at: repo.created_at,
|
545 |
updated_at: repo.updated_at
|
546 |
},
|
547 |
+
relevanceScore: Math.max(0.3, 0.7 - (rank * 0.1)), // Lower scores for GitHub results
|
548 |
rank: rank + 1,
|
549 |
searchQuery: query,
|
550 |
retrievalTime: Math.random() * 0.3 + 0.1,
|
|
|
856 |
const docIds = JSON.parse(jsonMatch[0]);
|
857 |
console.log(`π― AI extracted document IDs: ${JSON.stringify(docIds)}`);
|
858 |
|
859 |
+
// Get the relevant documents in order with boosted scores
|
860 |
allDocuments = docIds
|
861 |
.map((id: number) => allDocs.find(doc => doc.id === id))
|
862 |
.filter((doc: any) => doc !== undefined)
|
863 |
.slice(0, searchRequest.limit)
|
864 |
.map((doc: any, index: number) => ({
|
865 |
...doc,
|
866 |
+
relevanceScore: Math.min(1.0 - (index * 0.05), 1.0), // Higher scores for knowledge base
|
867 |
rank: index + 1,
|
868 |
snippet: doc.content.substring(0, 200) + '...'
|
869 |
}));
|
|
|
884 |
const localResults = await storage.searchDocuments(searchRequest);
|
885 |
allDocuments = localResults.results || [];
|
886 |
}
|
887 |
+
|
888 |
+
// If AI search failed or returned no results, fallback to regular search
|
889 |
+
if (allDocuments.length === 0) {
|
890 |
+
console.log('π AI search returned no results, falling back to regular keyword search...');
|
891 |
+
const localResults = await storage.searchDocuments(searchRequest);
|
892 |
+
// Boost relevance scores for knowledge base documents to prioritize them
|
893 |
+
allDocuments = (localResults.results || []).map(doc => ({
|
894 |
+
...doc,
|
895 |
+
relevanceScore: Math.min(doc.relevanceScore + 0.5, 1.0) // Boost by 0.5
|
896 |
+
}));
|
897 |
+
}
|
898 |
} else {
|
899 |
// Use regular keyword search for other search types
|
900 |
const localResults = await storage.searchDocuments(searchRequest);
|
901 |
+
// Boost relevance scores for knowledge base documents to prioritize them
|
902 |
+
allDocuments = (localResults.results || []).map(doc => ({
|
903 |
+
...doc,
|
904 |
+
relevanceScore: Math.min(doc.relevanceScore + 0.5, 1.0) // Boost by 0.5
|
905 |
+
}));
|
906 |
}
|
907 |
|
908 |
// Validate URLs in local storage results as well
|
|
|
929 |
}
|
930 |
}
|
931 |
|
932 |
+
// If we have local results, prioritize them. Only add external sources if no local results found.
|
933 |
+
if (allDocuments.length === 0) {
|
934 |
+
console.log(`No local results found for "${searchRequest.query}", searching external sources...`);
|
|
|
935 |
|
936 |
// Check if we should search GitHub for code-related queries
|
937 |
const isCodeQuery = searchRequest.query.toLowerCase().includes('python') ||
|
|
|
947 |
searchPromises.push(
|
948 |
searchGitHubRepos(searchRequest.query, Math.min(5, searchRequest.limit))
|
949 |
.then(repos => repos.map((repo, index) =>
|
950 |
+
transformGitHubRepoToDocument(repo, index, searchRequest.query)
|
951 |
))
|
952 |
);
|
953 |
}
|
954 |
|
955 |
+
// Always include web search for broader coverage when no local results
|
956 |
searchPromises.push(
|
957 |
+
searchWeb(searchRequest.query, Math.min(5, searchRequest.limit))
|
958 |
.then(webResults => webResults.map((result, index) =>
|
959 |
+
transformWebResultToDocument(result, index, searchRequest.query)
|
960 |
))
|
961 |
);
|
962 |
|
|
|
964 |
const externalResults = await Promise.all(searchPromises);
|
965 |
const flattenedResults = externalResults.flat();
|
966 |
|
967 |
+
// Sort external results by relevance (external results have lower base scores)
|
968 |
+
allDocuments = flattenedResults
|
969 |
.sort((a, b) => b.relevanceScore - a.relevanceScore)
|
970 |
.slice(0, searchRequest.limit);
|
971 |
+
} else {
|
972 |
+
console.log(`Found ${allDocuments.length} local documents, prioritizing knowledge base results.`);
|
973 |
+
// Limit local results to the requested amount
|
974 |
+
allDocuments = allDocuments.slice(0, searchRequest.limit);
|
975 |
}
|
976 |
|
977 |
const searchTime = (Date.now() - startTime) / 1000;
|