一、Term的查询和全文搜索
1.Term查询
《1.》在ES中,Term查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分。例如:“Apple Store”
《2.》可以通过Constant Score将查询转换成一个Filtering,避免算分,并利用缓存,提供性能。
#批量插入几条上抛相关的数据
POST /products/_bulk
{ "index": { "_id": 1 }}
{ "productID" : "XHDK-A-1293-#fJ3","desc":"iPhone" }
{ "index": { "_id": 2 }}
{ "productID" : "KDKE-B-9947-#kL5","desc":"iPad" }
{ "index": { "_id": 3 }}
{ "productID" : "JODL-X-1937-#pV7","desc":"MBP" }
#查询一下索引的相关信息
GET /products
GET /products/_settings
GET /products/_mapping
#iPhone查询不到! iphone可以查询到?!
#
POST /products/_search
{
"query": {
"term": {
"desc": {
"value": "iPhone" //查询不到!
//"value":"iphone"
}
}
}
}
查询不到的原因是:查询iPhone会自动利用standard进行分词,分词后,是用小写的“iphone”去查询。
POST /_analyze
{
"analyzer": "standard",
"text":"iPhone"
}
但是,如果我们用keyword进行查询,iPhone可以查询到,iphone不可以查询到!
因为desc被分词了(默认分词器还会转小写)。如果要做精确匹配,需要要看keyword类型的字段。
#iPhone可以查询到,iphone不可以查询到
POST /products/_search
{
"query": {
"term": {
"desc.keyword": {
//"value": "iPhone" //可以查到
"value":"iphone"
}
}
}
}
如果字段设置了keyword,你用term查询,就会精确匹配。例如说keyword字段,索引时是“Iphone”,你的term查询必须是Iphone,输入“iphone”就无法匹配。而如果你的字段是“text”类型。你index时候,如果是“Iphone”,在term查询时,“iphone”可以匹配。但是,“Iphone”不会。很多刚接触的同学会有点困惑。背后的原因是,text类型的数据会分词,默认分词器会将输入一个个单词切开,并且转小写了。所以你 term查询时,必须用“iphone”。
举个例子:
#查询不到
POST /products/_search
{
"query": {
"term": {
"productID": {
"value": "XHDK-A-1293-#fJ3"
}
}
}
}
#可以查询到,注意有score得分!!!!!
#多字段属性keyword的利用
POST /products/_search
{
//"explain": true,
"query": {
"term": {
"productID.keyword": {
"value": "XHDK-A-1293-#fJ3"
}
}
}
}
#分词分析
POST /_analyze
{
"analyzer": "standard",
"text":"XHDK-A-1293-#fJ3"
}
2.Constant Score转为Filter
《1.》将Query转为Filter,忽略TF-IDF计算,避免相关性算分的开销
《2.》Filter可以有效利用缓存
#_score都是1.0分
POST /products/_search
{
"explain": true,
"query": {
"constant_score": {
"filter": {
"term": {
"productID.keyword": "XHDK-A-1293-#fJ3"
}
}
}
}
}
3.全文检索
《1.》Match Query Result
《2.》Operator
《3.》Minimum_should_match
《4.》Match Phrase Query
过程: