feat(search): add search by title/content index and tag at the same time (#978)
* feat(search): add search by title/content index and tag at the same time * fix(search): set search type to basic and remove tag from term for proper highlightning and scroll when searched by tag and title/content index * fix(search): use indexOf to find space so it is easier to read * fix(search): trim trailing whitespaces before splitting * fix(search): set limit to 10000 for combined search mode (to make filter by tag more accurate)
This commit is contained in:
		@@ -21,6 +21,7 @@ let index = new FlexSearch.Document<Item>({
 | 
			
		||||
  encode: encoder,
 | 
			
		||||
  document: {
 | 
			
		||||
    id: "id",
 | 
			
		||||
    tag: "tags",
 | 
			
		||||
    index: [
 | 
			
		||||
      {
 | 
			
		||||
        field: "title",
 | 
			
		||||
@@ -405,11 +406,33 @@ document.addEventListener("nav", async (e: CustomEventMap["nav"]) => {
 | 
			
		||||
 | 
			
		||||
    let searchResults: FlexSearch.SimpleDocumentSearchResultSetUnit[]
 | 
			
		||||
    if (searchType === "tags") {
 | 
			
		||||
      searchResults = await index.searchAsync({
 | 
			
		||||
        query: currentSearchTerm.substring(1),
 | 
			
		||||
        limit: numSearchResults,
 | 
			
		||||
        index: ["tags"],
 | 
			
		||||
      })
 | 
			
		||||
      currentSearchTerm = currentSearchTerm.substring(1).trim()
 | 
			
		||||
      const separatorIndex = currentSearchTerm.indexOf(" ")
 | 
			
		||||
      if (separatorIndex != -1) {
 | 
			
		||||
        // search by title and content index and then filter by tag (implemented in flexsearch)
 | 
			
		||||
        const tag = currentSearchTerm.substring(0, separatorIndex)
 | 
			
		||||
        const query = currentSearchTerm.substring(separatorIndex + 1).trim()
 | 
			
		||||
        searchResults = await index.searchAsync({
 | 
			
		||||
          query: query,
 | 
			
		||||
          // return at least 10000 documents, so it is enough to filter them by tag (implemented in flexsearch)
 | 
			
		||||
          limit: Math.max(numSearchResults, 10000),
 | 
			
		||||
          index: ["title", "content"],
 | 
			
		||||
          tag: tag,
 | 
			
		||||
        })
 | 
			
		||||
        for (let searchResult of searchResults) {
 | 
			
		||||
          searchResult.result = searchResult.result.slice(0, numSearchResults)
 | 
			
		||||
        }
 | 
			
		||||
        // set search type to basic and remove tag from term for proper highlightning and scroll
 | 
			
		||||
        searchType = "basic"
 | 
			
		||||
        currentSearchTerm = query
 | 
			
		||||
      } else {
 | 
			
		||||
        // default search by tags index
 | 
			
		||||
        searchResults = await index.searchAsync({
 | 
			
		||||
          query: currentSearchTerm,
 | 
			
		||||
          limit: numSearchResults,
 | 
			
		||||
          index: ["tags"],
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
    } else if (searchType === "basic") {
 | 
			
		||||
      searchResults = await index.searchAsync({
 | 
			
		||||
        query: currentSearchTerm,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user