mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-09-22 06:00:56 +02:00
feat: search in progress
This commit is contained in:
parent
9995a159aa
commit
6d2f3361d0
6 changed files with 84 additions and 24 deletions
29
api/lib/utils/mergeSort.js
Normal file
29
api/lib/utils/mergeSort.js
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
function mergeSort(arr, compareFn) {
|
||||||
|
if (arr.length <= 1) {
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mid = Math.floor(arr.length / 2);
|
||||||
|
const leftArr = arr.slice(0, mid);
|
||||||
|
const rightArr = arr.slice(mid);
|
||||||
|
|
||||||
|
return merge(mergeSort(leftArr, compareFn), mergeSort(rightArr, compareFn), compareFn);
|
||||||
|
}
|
||||||
|
|
||||||
|
function merge(leftArr, rightArr, compareFn) {
|
||||||
|
const result = [];
|
||||||
|
let leftIndex = 0;
|
||||||
|
let rightIndex = 0;
|
||||||
|
|
||||||
|
while (leftIndex < leftArr.length && rightIndex < rightArr.length) {
|
||||||
|
if (compareFn(leftArr[leftIndex], rightArr[rightIndex]) < 0) {
|
||||||
|
result.push(leftArr[leftIndex++]);
|
||||||
|
} else {
|
||||||
|
result.push(rightArr[rightIndex++]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.concat(leftArr.slice(leftIndex)).concat(rightArr.slice(rightIndex));
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = mergeSort;
|
26
api/lib/utils/reduceHits.js
Normal file
26
api/lib/utils/reduceHits.js
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
const mergeSort = require('./mergeSort');
|
||||||
|
|
||||||
|
function reduceHits(hits) {
|
||||||
|
const counts = {};
|
||||||
|
|
||||||
|
for (const hit of hits) {
|
||||||
|
if (!counts[hit.conversationId]) {
|
||||||
|
counts[hit.conversationId] = 1;
|
||||||
|
} else {
|
||||||
|
counts[hit.conversationId]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = [];
|
||||||
|
|
||||||
|
for (const [conversationId, count] of Object.entries(counts)) {
|
||||||
|
result.push({
|
||||||
|
conversationId,
|
||||||
|
count
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return mergeSort(result, (a, b) => b.count - a.count);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = reduceHits;
|
|
@ -1,6 +1,7 @@
|
||||||
const express = require('express');
|
const express = require('express');
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
const { Message } = require('../../models/Message');
|
const { Message } = require('../../models/Message');
|
||||||
|
const reduceHits = require('../../lib/utils/reduceHits');
|
||||||
// const { MeiliSearch } = require('meilisearch');
|
// const { MeiliSearch } = require('meilisearch');
|
||||||
|
|
||||||
router.get('/sync', async function (req, res) {
|
router.get('/sync', async function (req, res) {
|
||||||
|
@ -15,8 +16,14 @@ router.get('/sync', async function (req, res) {
|
||||||
router.get('/', async function (req, res) {
|
router.get('/', async function (req, res) {
|
||||||
const { q } = req.query;
|
const { q } = req.query;
|
||||||
const result = await Message.meiliSearch({ query: q });
|
const result = await Message.meiliSearch({ query: q });
|
||||||
console.log(result);
|
const sortedHits = reduceHits(result.hits);
|
||||||
res.send(result);
|
console.log(sortedHits);
|
||||||
|
res.send(sortedHits);
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get('/clear', async function (req, res) {
|
||||||
|
await Message.resetIndex();
|
||||||
|
res.send('cleared');
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|
|
@ -15,29 +15,27 @@ const App = () => {
|
||||||
const { messages, messageTree } = useSelector((state) => state.messages);
|
const { messages, messageTree } = useSelector((state) => state.messages);
|
||||||
const { user } = useSelector((state) => state.user);
|
const { user } = useSelector((state) => state.user);
|
||||||
const { title } = useSelector((state) => state.convo);
|
const { title } = useSelector((state) => state.convo);
|
||||||
const { conversationId } = useSelector((state) => state.convo);
|
|
||||||
const [ navVisible, setNavVisible ]= useState(false)
|
const [ navVisible, setNavVisible ]= useState(false)
|
||||||
useDocumentTitle(title);
|
useDocumentTitle(title);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(async () => {
|
||||||
axios.get('/api/me', {
|
try {
|
||||||
timeout: 1000,
|
const response = await axios.get('/api/me', {
|
||||||
withCredentials: true
|
timeout: 1000,
|
||||||
}).then((res) => {
|
withCredentials: true
|
||||||
return res.data
|
});
|
||||||
}).then((user) => {
|
const user = response.data;
|
||||||
if (user)
|
if (user) {
|
||||||
dispatch(setUser(user))
|
dispatch(setUser(user));
|
||||||
else {
|
} else {
|
||||||
console.log('Not login!')
|
console.log('Not login!');
|
||||||
window.location.href = "/auth/login";
|
window.location.href = '/auth/login';
|
||||||
}
|
}
|
||||||
}).catch((error) => {
|
} catch (error) {
|
||||||
console.error(error)
|
console.error(error);
|
||||||
console.log('Not login!')
|
console.log('Not login!');
|
||||||
window.location.href = "/auth/login";
|
window.location.href = '/auth/login';
|
||||||
})
|
}
|
||||||
// setUser
|
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
if (user)
|
if (user)
|
||||||
|
|
|
@ -3,7 +3,6 @@ import NewChat from './NewChat';
|
||||||
import Spinner from '../svg/Spinner';
|
import Spinner from '../svg/Spinner';
|
||||||
import Conversations from '../Conversations';
|
import Conversations from '../Conversations';
|
||||||
import NavLinks from './NavLinks';
|
import NavLinks from './NavLinks';
|
||||||
import useDidMountEffect from '~/hooks/useDidMountEffect';
|
|
||||||
import { swr } from '~/utils/fetchers';
|
import { swr } from '~/utils/fetchers';
|
||||||
import { useDispatch, useSelector } from 'react-redux';
|
import { useDispatch, useSelector } from 'react-redux';
|
||||||
import { increasePage, decreasePage, setPage, setConvos, setPages } from '~/store/convoSlice';
|
import { increasePage, decreasePage, setPage, setConvos, setPages } from '~/store/convoSlice';
|
||||||
|
@ -11,7 +10,7 @@ import { increasePage, decreasePage, setPage, setConvos, setPages } from '~/stor
|
||||||
export default function Nav({ navVisible, setNavVisible }) {
|
export default function Nav({ navVisible, setNavVisible }) {
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const [isHovering, setIsHovering] = useState(false);
|
const [isHovering, setIsHovering] = useState(false);
|
||||||
const { conversationId, convos, pages, pageNumber, refreshConvoHint } = useSelector(
|
const { conversationId, convos, search, pages, pageNumber, refreshConvoHint } = useSelector(
|
||||||
(state) => state.convo
|
(state) => state.convo
|
||||||
);
|
);
|
||||||
const onSuccess = (data) => {
|
const onSuccess = (data) => {
|
||||||
|
@ -25,7 +24,7 @@ export default function Nav({ navVisible, setNavVisible }) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const { data, isLoading, mutate } = swr(`/api/convos?pageNumber=${pageNumber}`, onSuccess, {
|
const { data, isLoading, mutate } = swr(`/api/${search ? 'search?q=' : `convos?pageNumber=${pageNumber}`}`, onSuccess, {
|
||||||
revalidateOnMount: false
|
revalidateOnMount: false
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ const initialState = {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pages: 1,
|
pages: 1,
|
||||||
refreshConvoHint: 0,
|
refreshConvoHint: 0,
|
||||||
|
search: false,
|
||||||
convos: [],
|
convos: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue