请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

es match_phrase 匹配问题

老师 ,比如match_phrase我想匹配到“中文”,但“中文字”,“学中文”,“学中文字”也被匹配到了,有没有办法只匹配到“中文”

正在回答 回答被采纳积分+3

插入代码

1回答

bobby 2021-06-23 16:24:38

es是基于分词存储的,你这里能搜索到是因为保存到es中的时候这个字段会默认被分词,然后你搜索的时候就会出现把你的query分词之后去和这个字段匹配,但是很多时候某些字段你不希望被分词,比如用户姓名就不能分词,这个时候你只要在mapping中将这个字段设置为keyword类型,那么es保存和搜索的时候就不会分词而是和mysql的等于一样全匹配了

0 回复 有任何疑惑可以回复我~
  • 提问者 sjdgbhb #1
    但是我那个字段是由好几个不同姓名通过分隔符组成的字符串,就像这样,“林建生,张三,王五”,我要搜索含“林建”这个人的字段,用match_phrase会把“林建生”那个字段也搜出来,另外,我自定义了分词,所有汉字都被分成一个字一个字的
    回复 有任何疑惑可以回复我~ 2021-06-23 18:33:00
  • bobby 回复 提问者 sjdgbhb #2
    这种你就应该事先处理好,比如自己先通过逗号分隔,然后分成多个次放入到一个数组中,可以参考这个 https://www.cnblogs.com/lovezbs/p/13790685.html
    回复 有任何疑惑可以回复我~ 2021-06-26 23:02:57
  • 提问者 sjdgbhb 回复 bobby #3
    这样也不行把,比如两条原始数据,
    1、{"uname": "林建生"},存储时前转为{"uname": ["林", "建", "生"]}
    2、{"uname": "林建"},存储时前转为{"uname": ["林", "建"]}
    搜索时我要得到"林建"这个人的数据,但按下面的也会把林建生那个人的数据搜出来
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "uname": "林"
              }
            },
            {
              "term": {
                "uname": "建"
              }
            }
          ]
        }
      }
    }
    回复 有任何疑惑可以回复我~ 2021-08-13 15:26:42
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号