for my app YouWho.io I ended up using matches and if that got 0 results I used if statement to run fulltext search which is like the best of both worlds. You can string multiple matches queries together with Moralis.Query.or(query1, query2, etc)
Not sure if this is the correct way to do it, its not elegant but it got the job done (mostly) for me…
const searchResults = async () => {
await handleLocation();
let geoPoint = new Moralis.GeoPoint(currLocRef.current);
let Services = Moralis.Object.extend("Services");
let queryTitle = new Moralis.Query(Services);
queryTitle.matches("title", query);
let queryCategory = new Moralis.Query(Services);
queryCategory.matches("category", query);
let querySubCategory = new Moralis.Query(Services);
querySubCategory.matches("subCategory", query);
let queryDescription = new Moralis.Query(Services);
queryDescription.matches("description", query);
let queryServices;
if (query !== "" && query !== null) {
await handleLocation();
geoPoint = new Moralis.GeoPoint(currLocRef.current);
queryServices = Moralis.Query.or(queryTitle, queryCategory, querySubCategory, queryDescription);
queryServices.include("providerPublic");
if (sortResults) {
if (sortResults === "nearest") {
if (currLocRef.current[0] === 13.37 && currLocRef.current[1] === 13.37) {
setSortResults("rateDesc");
setNewServiceError(["Geolocation Failed", "Please allow location or GPS in your web-browser or device."]);
setShowAlert(true);
return;
} else {
try {
queryServices.near("location", geoPoint);
} catch (error) {
console.log(error)
}
}
}
if (sortResults === "rateDesc") {
queryServices.descending("rate");
}
if (sortResults === "rateAsc") {
queryServices.ascending("rate");
}
if (sortResults === "reviewDesc") {
queryServices.descending("updatedAt");
}
if (sortResults === "reviewAsc") {
queryServices.ascending("updatedAt");
}
if (sortResults === "newest") {
queryServices.descending("updatedAt");
}
if (sortResults === "oldest") {
queryServices.ascending("updatedAt");
}
};
await queryServices.find()
.then(async function (results) {
if (currLocRef.current[0] !== 13.37 && currLocRef.current[1] !== 13.37) {
for (let i = 0; i < results.length; ++i) {
results[i].distance = results[i].attributes.location.kilometersTo(geoPoint).toFixed(1);
}
};
setQueryResults(results);
if (results.length === 0) {
await handleLocation();
geoPoint = new Moralis.GeoPoint(currLocRef.current);
let queryCategoryText = new Moralis.Query(Services);
queryCategoryText.fullText("category", query);
queryCategoryText.include("providerPublic");
if (sortResults) {
if (sortResults === "nearest") {
if (currLocRef.current[0] === 13.37 && currLocRef.current[1] === 13.37) {
setSortResults("rateDesc");
setNewServiceError(["Geolocation Failed", "Please allow location or GPS in your web-browser or device."]);
setShowAlert(true);
return;
} else {
try {
queryServices.near("location", geoPoint);
} catch (error) {
console.log(error)
}
}
}
if (sortResults === "rateDesc") {
queryCategoryText.descending("rate");
}
if (sortResults === "rateAsc") {
queryCategoryText.ascending("rate");
}
if (sortResults === "reviewDesc") {
queryCategoryText.descending("updatedAt");
}
if (sortResults === "reviewAsc") {
queryCategoryText.ascending("updatedAt");
}
if (sortResults === "newest") {
queryCategoryText.descending("updatedAt");
}
if (sortResults === "oldest") {
queryCategoryText.ascending("updatedAt");
}
};
await queryCategoryText.find()
.then(async function (results) {
if (currLocRef.current[0] !== 13.37 && currLocRef.current[1] !== 13.37) {
for (let i = 0; i < results.length; ++i) {
results[i].distance = results[i].attributes.location.kilometersTo(geoPoint).toFixed(1);
}
};
setQueryResults(results);
if (results.length === 0) {
await handleLocation();
geoPoint = new Moralis.GeoPoint(currLocRef.current);
let queryTitleText = new Moralis.Query(Services);
queryTitleText.fullText("title", query);
queryTitleText.include("providerPublic");
if (sortResults) {
if (sortResults === "nearest") {
if (currLocRef.current[0] === 13.37 && currLocRef.current[1] === 13.37) {
setSortResults("rateDesc");
setNewServiceError(["Geolocation Failed", "Please allow location or GPS in your web-browser or device."]);
setShowAlert(true);
return;
} else {
try {
queryServices.near("location", geoPoint);
} catch (error) {
console.log(error)
}
}
}
if (sortResults === "rateDesc") {
queryTitleText.descending("rate");
}
if (sortResults === "rateAsc") {
queryTitleText.ascending("rate");
}
if (sortResults === "reviewDesc") {
queryTitleText.descending("updatedAt");
}
if (sortResults === "reviewAsc") {
queryTitleText.ascending("updatedAt");
}
if (sortResults === "newest") {
queryTitleText.descending("updatedAt");
}
if (sortResults === "oldest") {
queryTitleText.ascending("updatedAt");
}
};
await queryTitleText.find()
.then(function (results) {
if (currLocRef.current[0] !== 13.37 && currLocRef.current[1] !== 13.37) {
for (let i = 0; i < results.length; ++i) {
results[i].distance = results[i].attributes.location.kilometersTo(geoPoint).toFixed(1);
}
};
setQueryResults(results);
if (results.length === 0) {
setNoSearchResults(noResults);
}
})
}
})
}
})
.catch(function (error) {
// There was an error.
setNewServiceError(["Search Failed", error.message]);
setShowAlert(true);
});
} else {
queryServices = new Moralis.Query(Services);
await handleLocation();
geoPoint = new Moralis.GeoPoint(currLocRef.current);
if (sortResults) {
if (sortResults === "nearest") {
if (currLocRef.current[0] === 13.37 && currLocRef.current[1] === 13.37) {
setSortResults("rateDesc");
setNewServiceError(["Geolocation Failed", "Please allow location or GPS in your web-browser or device."]);
setShowAlert(true);
return;
} else {
queryServices.near("location", geoPoint);
}
}
if (sortResults === "rateDesc") {
queryServices.descending("rate");
}
if (sortResults === "rateAsc") {
queryServices.ascending("rate");
}
if (sortResults === "reviewDesc") {
queryServices.descending("updatedAt");
}
if (sortResults === "reviewAsc") {
queryServices.ascending("updatedAt");
}
if (sortResults === "newest") {
queryServices.descending("updatedAt");
}
if (sortResults === "oldest") {
queryServices.ascending("updatedAt");
}
};
if (who !== "" && who !== null) {
const providerObject = Moralis.Object.extend("UserPublic");
const queryProvider = new Moralis.Query(providerObject);
queryProvider.equalTo("username", String(who))
const userProvider = await queryProvider.first();
queryServices.equalTo("providerPublic", userProvider);
}
queryServices.limit(50);
queryServices.include("providerPublic");
await queryServices.find().then(function (results) {
// results contains a weight / rank in result.get('score')
if (results.length === 0) {
setNoSearchResults(noResults);
} else {
if (currLocRef.current[0] !== 13.37 && currLocRef.current[1] !== 13.37) {
for (let i = 0; i < results.length; ++i) {
results[i].distance = results[i].attributes.location.kilometersTo(geoPoint).toFixed(1);
}
};
setQueryResults(results);
}
})
.catch(function (error) {
// There was an error.
setNewServiceError(["Search Failed", error.message]);
setShowAlert(true);
});
}
}