一个字搜索不出来
如果只搜索一个字,搜索不出来,怎么解决?
我的也是,版本6.2.2,如果不用中文分词一个字是可以搜到的,如果用ik_smart必须要2个字符以上才能搜索,比如字符串"江苏省XXX",搜索时"江"和"江苏"都无法搜到结果,使用ik_max_word的话2个字可以,1个字搜不到结果,你们有这个问题吗!
我也遇到了。最近给一个问题困扰好久啊。这个词:鹰牌 印尼进口酸梅粉/水果伴侣 150g/瓶; 梅(搜不到)梅粉(搜不到) 酸梅粉(搜到)酸梅(搜到)
用的是5.6.3版本
词:蒙牛 纯牛奶250ml×16盒/件; 输入:蒙牛牛奶搜索不到。输入:蒙牛 牛奶就可以搜索,中间加个空格。求指点
我建立ik_smart或者ik_max_word这个的时候,明明是设置了"search_analyzer":"ik_max_word",但是在mapping里面看不到"search_analyzer"属性,只有“analyzer”属性,不知道是为什么,是不是这个原因导致的一个字搜不出来呢?你们有吗?版本6.2.2,如: "mappings": { "order_type": { "properties": { "address": { "analyzer": "ik_max_word", "type": "text" } }
"江苏省" 用ik_smart的分词结果只有一个词”江苏省“。所以用”江“或”江苏“都匹配不上。 这种情况需要把词库中的“江苏省”甚至“江苏”都删除。 如果想要的分词效果是拆成单个字,可以用standard分词。但是这样分词的结果就没有词语了,全是单字。
如果分词结果既想要单字,又想要词语,目前的分词好像达不到。
我的解决方法:修改配置文件 config ▸ analysis-ik ▸ IKAnalyzer.cfg.xml ▸ 引入单字词典:
這裡提供另外一個解法,就是額外新增一個 field 使用自訂的 unigram_tokenizer(即 NGram Tokenizer),然後搜尋的時候同時查找原始欄位和 unigram 欄位:
{
"settings": {
"analysis": {
"tokenizer": {
"unigram_tokenizer": {
"type": "ngram",
"min_gram": 1,
"max_gram": 1,
"token_chars": [
"letter",
"digit"
]
}
},
"analyzer": {
"unigram_analyzer": {
"tokenizer": "unigram_tokenizer",
"filter": [
"trim",
"asciifolding",
"cjk_width",
"lowercase"
]
}
}
}
},
"mappings": {
"properties": {
"hashtag": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart",
"fields": {
"raw": {
"type": "keyword"
},
"unigram": {
"type": "text",
"analyzer": "unigram_analyzer",
"search_analyzer": "ik_smart"
}
}
},
"posted_at": {
"type": "date"
}
}
}
}
Query DSL 類似這樣:
{
"query": {
"bool": {
"should": [
{
"match": {
"hashtag": {
"query": "苦",
"boost": 2
}
}
},
{
"match": {
"hashtag.unigram": "苦"
}
}
]
}
}
}
或是也可以在 application 層判斷,搜尋的字串長度為 1 時,只查詢 hashtag.unigram 欄位。
#706
我这里能分出token,但是单字似乎还是不能搜索
這裡提供另外一個解法,就是額外新增一個 field 使用自訂的
unigram_tokenizer(即 NGram Tokenizer),然後搜尋的時候同時查找原始欄位和 unigram 欄位:{ "settings": { "analysis": { "tokenizer": { "unigram_tokenizer": { "type": "ngram", "min_gram": 1, "max_gram": 1, "token_chars": [ "letter", "digit" ] } }, "analyzer": { "unigram_analyzer": { "tokenizer": "unigram_tokenizer", "filter": [ "trim", "asciifolding", "cjk_width", "lowercase" ] } } } }, "mappings": { "properties": { "hashtag": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart", "fields": { "raw": { "type": "keyword" }, "unigram": { "type": "text", "analyzer": "unigram_analyzer", "search_analyzer": "ik_smart" } } }, "posted_at": { "type": "date" } } } }Query DSL 類似這樣:
{ "query": { "bool": { "should": [ { "match": { "hashtag": { "query": "苦", "boost": 2 } } }, { "match": { "hashtag.unigram": "苦" } } ] } } }或是也可以在 application 層判斷,搜尋的字串長度為
1時,只查詢hashtag.unigram欄位。
正解,我的做法类似:
"title":{
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer" : "ik_smart",
"fields":{
"keyword":{
"type":"keyword"
}
}
}
在mapping里让title可以按默认分词器来索引,在代码里用multi_match来查:
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("status", 1))
.must(QueryBuilders.multiMatchQuery(keyword, "title", "title.keyword"));
这里说明下,title按ik来查,title.keyword按默认分词器查,然而,title和title.keyword是同一个字段
"fields":{ "keyword":{ "type":"keyword" } }
keyword不是默认不分词么 是不是type要指定成text
extra_single_word.dic
正解