今天在遇到es查詢的時候,遇到了難點,花了半天才發現問題原因。
需求是:es實現模糊查詢。相當於sql中的like %像%一樣。但是在開發過程中,我使用了各種分詞,各種查詢**,總是實現不了。
問題:比如:我查詢切片麵包可以查詢出來,但是我查詢切麵包就查詢不出來。
原因是es預設採用了分詞機制,導致我查詢的時候,切麵包沒有放在乙個分詞中,查詢不到。
matchquerybuilder matchquerybuilder = new matchquerybuilder("name", name);
// iterableiterable = commodityrepository.search(matchquerybuilder);
// iterableiterable = commodityrepository.search(matchquerybuilder);
// iterable.foreach(e->list.add(e));
查詢資料後,我測試下面的**:
wildcardquerybuilder wildcardquerybuilder = querybuilders.wildcardquery("name", "*" name "*");
iterableiterable = commodityrepository.search(wildcardquerybuilder);
測試了一下,還不行。鬱悶中。
字段分詞器
然後我在字段屬性上,加上分詞器。先刪除es上的資料,然後重新插入資料。
@field(type = fieldtype.text, analyzer = "ik_max_word")
private string title; //標題
測試上面二個**,還是沒法查詢出切麵包的資料。
最後,我嘗試刪除整個索引,再重新插入資料測試一下
delete /commodity
整個命令就是kibaba中的刪除索引命令。然後,我在字段屬性中設定為keyword:
@field(type = fieldtype.keyword)
private string name;
然後,重新插入資料,利用模糊查詢**執行:
wildcardquerybuilder wildcardquerybuilder = querybuilders.wildcardquery("name", "*" name "*");
iterableiterable = commodityrepository.search(wildcardquerybuilder);
奇蹟出現了,居然成功了。無論我查詢什麼,只要包含,就可以查詢出來。終於解決了這個問題,總算松了口氣。
總結在改變了索引(文件)的屬性時,原來屬性為text,後來改為keyword。所以必須先刪除乾淨索引,重新插入資料,在模糊查詢。我的原因就是沒有刪除索引導致的。一定要記得重新生成索引才可以做到模糊查詢的效果。
模糊查詢 es模糊查詢處理輸入的錯詞
使用者會經常不小心或者記不太清自己所要搜尋的詞,而導致在查詢過程中輸入一些錯字,這時通過elasticsearch的模糊查詢來處理輸入的錯字,非常有利於提高使用者的搜尋體驗。在查詢過程中,如果沒有使用模糊查詢,如果我輸入的詞中有錯詞,我們一般是很難通過匹配查詢到想要的結果。讓我們首先舉個例子,錯字 ...
模糊查詢的問題
在sql server中模糊查詢通常是這樣的select from articletable where authorname like jacky 但是在access中用這條語句執行的時候竟然發現查不出結果,怎麼可能呢?後來查了下資料,發現問題如下 要進行模糊查詢,則必須使用萬用字元,access...
模糊查詢「 」轉換問題
在做乙個系統,功能是充值查詢,在此用的是模糊查詢 比如我要查詢乙個叫小明的同學,我只輸入 小 表內就出現所有姓名中有關小的同學 在做的過程中遇到乙個問題,都知道模糊查詢少不了 的應用。在此我還寫過關於d層訪問資料庫的初始寫法,方法沒有錯,放到sql sever裡是可以找到的,但是寫在vs裡需要強轉,...