Improve search a bit

This commit is contained in:
Rogerio Chaves 2020-04-20 21:57:00 +02:00
parent b7cb6f69e7
commit 3b06e741bd
No known key found for this signature in database
GPG Key ID: E6AF5440509B1D94
3 changed files with 30 additions and 15 deletions

View File

@ -507,8 +507,11 @@ router.get("/search", async (req, res) => {
const query = req.query.query;
const people = await queries.searchPeople(ssbServer, query);
metrics.searchResults.observe(people.length);
let people = [];
if (query.length >= 3) {
people = await queries.searchPeople(ssbServer, query);
metrics.searchResults.observe(people.length);
}
res.render("search", { people, query });
});

View File

@ -191,6 +191,17 @@ const getSecretMessages = async (ssbServer, profile) => {
const searchPeople = async (ssbServer, search) => {
debugPeople("Fetching");
// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
const normalizedSearch = search
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "");
const safelyEscapedSearch = normalizedSearch.replace(
/[.*+?^${}()|[\]\\]/g,
"\\$&"
);
const loosenSpacesSearch = safelyEscapedSearch.replace(" ", ".*");
const searchRegex = new RegExp(`.*${loosenSpacesSearch}.*`, "i");
const people = await promisePull(
ssbServer.query.read({
reverse: true,
@ -208,12 +219,12 @@ const searchPeople = async (ssbServer, search) => {
],
}),
pull.filter((msg) => {
return (
msg.value.content &&
msg.value.author == msg.value.content.about &&
msg.value.content.name.includes(search)
);
})
const normalizedName = msg.value.content.name
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "");
return msg.value.content && searchRegex.exec(normalizedName);
}),
paramap(mapProfiles(ssbServer))
);
debugPeople("Done");

View File

@ -1,15 +1,16 @@
<%- include('_header') %>
<h2>Results for "<%= query %>"</h2>
<% if (query.length < 3) { %>
<h2>You need to search for 3 or more characters</h2>
<% } else { %>
<h2>Results for "<%= query %>"</h2>
<ul>
<% people.map(person => { %>
<li>
<a href="<%= profileUrl(person.author) %>">
<%= person.content.name %> (<%= person.author.slice(0, 8) %>)
<a class="link-block" href="<%= profileUrl(person.author) %>">
<img class="link-profile-pic" src="<%= profileImageUrl(person.authorProfile) %>" />
<div><%= person.content.name %></div>
</a>
</li>
<% }) %>
</ul>
<% } %>
<%- include('_footer') %>