使用url in field在elasticsearch中搜索查询

时间:2016-06-05 07:13:08

标签: c# elasticsearch nest querydsl

我必须在弹性搜索的索引数据中搜索文件位置路径。我以编码格式索引位置路径(尝试不编码)。以下查询返回所有索引数据,而不进行任何匹配。如果我使用 id 标题字段进行搜索,则会返回正确的结果。有人有任何想法吗?

{
"query": {
     "match": {
     "location": "%5c%5c25.94.150.212%5cfoldername%5cintroduction_to_c_sharp.ppt"
    }
}
}

我从浏览器http://localhost:9200/documents

获得的回复
{
  "documents": {
    "aliases": {},
    "mappings": {
      "indexdocument": {
        "properties": {
          "document": {
            "type": "attachment",
            "fields": {
              "content": {
                "type": "string"
              },
              "author": {
                "type": "string"
              },
              "title": {
                "type": "string",
                "term_vector": "with_positions_offsets"
              },
              "name": {
                "type": "string"
              },
              "date": {
                "type": "date",
                "format": "strict_date_optional_time||epoch_millis"
              },
              "keywords": {
                "type": "string"
              },
              "content_type": {
                "type": "string"
              },
              "content_length": {
                "type": "integer"
              },
              "language": {
                "type": "string"
              }
            }
          },
          "documentType": {
            "type": "string"
          },
          "id": {
            "type": "long"
          },
          "lastModifiedDate": {
            "type": "date",
            "format": "strict_date_optional_time||epoch_millis"
          },
          "location": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "1465193502636",
        "number_of_shards": "5",
        "number_of_replicas": "1",
        "uuid": "5kCRvhmsQAGyndkswLhLrg",
        "version": {
          "created": "2030399"
        }
      }
    },
    "warmers": {}
  }
}

创建具有一个字段附件的索引代码:

        public void CreateDocumentIndex()
           {
               this.client.CreateIndex("documents", c =>  c.Mappings(mp=>mp.Map<IndexDocument>
                   (m => m.Properties(ps => ps.Attachment
                                       (a => a.Name(o => o.Document)
                                             .TitleField(t => t.Name(x =>     x.Title).TermVector(TermVectorOption.WithPositionsOffsets))
                                              )))));
  }

要索引的属性

 public class IndexDocument
   {
    public long Id { get; set; }
    public string Title { get; set; }
    public string DocumentName { get; set; }
    // Base64-encoded file content.
    public string Document { get; set; }
    public string DocumentType { get; set; }
    [Nest.String(Store = true, Index = Nest.FieldIndexOption.NotAnalyzed)]
    public string Location { get; set; }        
    public DateTime LastModifiedDate { get; set; }

 }

1 个答案:

答案 0 :(得分:0)

如果您的location字段为not_analyzed,则可以使用term查询而不是match

{
   "query": {
      "term": {
         "location": "%5c%5c25.94.150.212%5cfoldername%5cintroduction_to_c_sharp.ppt"
      }
   }
}

否则,您需要制作location字段not_analyzed(见下文)并重新索引数据。

PUT your_index/_mapping/your_type
{
  "properties": {
    "location": {
      "type": "string"
      "fields": {
        "raw": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}

然后您可以使用以下term查询

{
   "query": {
      "term": {
         "location.raw": "%5c%5c25.94.150.212%5cfoldername%5cintroduction_to_c_sharp.ppt"
      }
   }
}