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 query = req.query.query;
const people = await queries.searchPeople(ssbServer, query); let people = [];
metrics.searchResults.observe(people.length); if (query.length >= 3) {
people = await queries.searchPeople(ssbServer, query);
metrics.searchResults.observe(people.length);
}
res.render("search", { people, query }); res.render("search", { people, query });
}); });

View File

@ -191,6 +191,17 @@ const getSecretMessages = async (ssbServer, profile) => {
const searchPeople = async (ssbServer, search) => { const searchPeople = async (ssbServer, search) => {
debugPeople("Fetching"); 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( const people = await promisePull(
ssbServer.query.read({ ssbServer.query.read({
reverse: true, reverse: true,
@ -208,12 +219,12 @@ const searchPeople = async (ssbServer, search) => {
], ],
}), }),
pull.filter((msg) => { pull.filter((msg) => {
return ( const normalizedName = msg.value.content.name
msg.value.content && .normalize("NFD")
msg.value.author == msg.value.content.about && .replace(/[\u0300-\u036f]/g, "");
msg.value.content.name.includes(search) return msg.value.content && searchRegex.exec(normalizedName);
); }),
}) paramap(mapProfiles(ssbServer))
); );
debugPeople("Done"); debugPeople("Done");

View File

@ -1,15 +1,16 @@
<%- include('_header') %> <%- 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 => { %> <% people.map(person => { %>
<li> <a class="link-block" href="<%= profileUrl(person.author) %>">
<a href="<%= profileUrl(person.author) %>"> <img class="link-profile-pic" src="<%= profileImageUrl(person.authorProfile) %>" />
<%= person.content.name %> (<%= person.author.slice(0, 8) %>) <div><%= person.content.name %></div>
</a> </a>
</li>
<% }) %> <% }) %>
</ul> <% } %>
<%- include('_footer') %> <%- include('_footer') %>