2017-01-06 38 views
1

我正在嘗試製作一個React instantsearch,可讓您搜索電話號碼。他們需要以這種格式顯示:「(123)456-7890」,但我希望能夠使用「(123)456-7890」或「1234567890」進行搜索。Algolia InstantSearch:如何使搜索不可知與格式與parens?

我想我可以將它存儲在格式化的索引中,然後打印錯誤容忍會處理非格式化的查詢。但是查詢「1234567890」沒有結果。它顯然與格式將數字分成三個單詞並且查詢只是一個單詞有關。奇怪的是,這意味着添加圓括號不會讓您在搜索中找到更多匹配字符,但將它們排除在外可能會導致查詢根本不匹配。

然後我試着把它作爲非格式化(只有數字)存儲在索引中。這一次,格式化和未格式化的查詢都得到了匹配。但是,當按位數字輸入時,當我到達「(123)」時結果消失,只有當我到達「(123)456-7」時纔會重新出現。看起來像是一個令人沮喪和奇怪的用戶體驗,只需輸入結果顯示的數字並使其消失即可。

我已經嘗試將perens添加到可選單詞設置中,但似乎沒有任何效果。我認爲,如果我能讓阿爾戈利亞忽略了這些perens和破折號,而不是用一個空格替換它們,那麼這整個事情就不會成爲問題。有沒有辦法做到這一點?也許最好找到一種方法來過濾查詢發送到Algolia之前?我應該怎麼做?

+0

不會幫助索引功能,格式化,格式化,並顯示格式化的一個? '{number_formatted:「(123)456-7890」,number_unformatted:1234567890}' 我剛試過,每次都匹配。 –

回答

1

1234567890存儲在名爲phoneNoFormat(123)456-7890的屬性中,屬性名爲phoneFormat。包括在searchableAttributes。在顯示側,查看_highlightResult字段,查看哪個屬性匹配並呈現該屬性的突出顯示結果。使用默認的打字錯誤容差,每個查詢都將匹配並正確突出顯示一個或兩個屬性。

1234567890 
123-456-7890 
(123)456-7890 
(123) 456-7890 
(123)4567890 
(123) 4567890 

由於您使用的陣營InstantSearch,你需要使自己的Hits組件,你可以更改用於顯示每個擊中的基礎上的結果的屬性名稱。謝天謝地,這不是太複雜。請參閱connectHits的文檔。

當您循環訪問時,請查看每個匹配的每個_highlightResult屬性以查看匹配的兩個屬性中的哪一個。然後,在創建<Highlight />組件時,將attributeName屬性設置爲正確的屬性。所以,你有這樣的:

<Highlight attributeName='phoneFormat' hit={hit}/> 

或者這樣:

<Highlight attributeName='phoneNoFormat' hit={hit}/>