analysis-ik icon indicating copy to clipboard operation
analysis-ik copied to clipboard

一个字搜索不出来

Open hezhiqiang opened this issue 7 years ago • 12 comments

如果只搜索一个字,搜索不出来,怎么解决?

hezhiqiang avatar May 10 '18 02:05 hezhiqiang

我的也是,版本6.2.2,如果不用中文分词一个字是可以搜到的,如果用ik_smart必须要2个字符以上才能搜索,比如字符串"江苏省XXX",搜索时"江"和"江苏"都无法搜到结果,使用ik_max_word的话2个字可以,1个字搜不到结果,你们有这个问题吗!

zhaheng avatar May 17 '18 04:05 zhaheng

我也遇到了。最近给一个问题困扰好久啊。这个词:鹰牌 印尼进口酸梅粉/水果伴侣 150g/瓶; 梅(搜不到)梅粉(搜不到) 酸梅粉(搜到)酸梅(搜到)

inotgaoshou avatar May 18 '18 01:05 inotgaoshou

用的是5.6.3版本

inotgaoshou avatar May 18 '18 01:05 inotgaoshou

词:蒙牛 纯牛奶250ml×16盒/件; 输入:蒙牛牛奶搜索不到。输入:蒙牛 牛奶就可以搜索,中间加个空格。求指点

inotgaoshou avatar May 18 '18 05:05 inotgaoshou

我建立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" } }

zhaheng avatar May 21 '18 08:05 zhaheng

"江苏省" 用ik_smart的分词结果只有一个词”江苏省“。所以用”江“或”江苏“都匹配不上。 这种情况需要把词库中的“江苏省”甚至“江苏”都删除。 如果想要的分词效果是拆成单个字,可以用standard分词。但是这样分词的结果就没有词语了,全是单字。

如果分词结果既想要单字,又想要词语,目前的分词好像达不到。

csyjgu avatar Jul 05 '18 04:07 csyjgu

我的解决方法:修改配置文件 ⁨config⁩ ▸ ⁨analysis-ik⁩ ▸ IKAnalyzer.cfg.xml ▸ 引入单字词典:extra_single_word.dic

sscfaith avatar Mar 28 '19 01:03 sscfaith

這裡提供另外一個解法,就是額外新增一個 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 欄位。

vinta avatar Jun 27 '19 07:06 vinta

#706

我这里能分出token,但是单字似乎还是不能搜索

hackerwin7 avatar Aug 02 '19 08:08 hackerwin7

這裡提供另外一個解法,就是額外新增一個 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是同一个字段

lengmianshi avatar Feb 14 '20 16:02 lengmianshi

"fields":{ "keyword":{ "type":"keyword" } }

keyword不是默认不分词么 是不是type要指定成text

zhuchao941 avatar Nov 01 '20 15:11 zhuchao941

extra_single_word.dic

正解

hvincenty avatar Feb 15 '23 07:02 hvincenty