Hello,
I'm starting out with Bleve, and would like to use it for searching email headers. I'm struggling to understand how document mapping works. Using default settings I get results, however I don't get results when I customise the mapping.
Here is a sample program showing my custom mapping:
package main
import (
"bytes"
"fmt"
"log"
"net/mail"
"github.com/blevesearch/bleve"
"github.com/blevesearch/bleve/analysis/analyzer/keyword"
"github.com/blevesearch/bleve/mapping"
"github.com/blevesearch/bleve/search/query"
)
const email = `Subject: test email
To: Bob Smith <b...@example.com>
From: Jane Smith <ja...@example.com>
Date: Tue, 29 Nov 2016 21:48:47 +1000
This is a test email
`
const searchQuery = "test"
type bleveDoc struct {
Type string
Data mail.Header
}
func main() {
var err error
var index bleve.Index
// the default mapping returns results, however my custom mapping does not
//mapping := bleve.NewIndexMapping()
mapping := buildIndexMapping()
index, err = bleve.NewMemOnly(mapping)
if err != nil {
log.Fatal(err)
}
var msg *mail.Message
msg, err = mail.ReadMessage(bytes.NewReader([]byte(email)))
if err != nil {
log.Fatal(err)
}
doc := bleveDoc{"header", msg.Header}
if err := index.Index("testdoc", doc); err != nil {
log.Fatal(err)
}
fmt.Printf("Searching with query '%s'\n", searchQuery)
bSearchRequest := bleve.NewSearchRequest(query.NewQueryStringQuery(searchQuery))
searchResult, err := index.Search(bSearchRequest)
if err != nil {
log.Fatal(err)
}
fmt.Println("Hits:")
for _, hit := range searchResult.Hits {
fmt.Printf("ID %s, Locations %v, Fields %v\n", hit.ID, hit.Locations, hit.Fields)
}
}
func buildIndexMapping() mapping.IndexMapping {
mapping := bleve.NewIndexMapping()
keywordFieldMapping := bleve.NewTextFieldMapping()
keywordFieldMapping.Analyzer = keyword.Name
docMapping := bleve.NewDocumentMapping()
docMapping.AddFieldMappingsAt("Type", keywordFieldMapping)
headerMapping := bleve.NewDocumentMapping()
headerMapping.AddFieldMappingsAt("Subject", keywordFieldMapping)
headerMapping.AddFieldMappingsAt("From", keywordFieldMapping)
headerMapping.AddFieldMappingsAt("To", keywordFieldMapping)
headerMapping.AddFieldMappingsAt("Date", keywordFieldMapping)
docMapping.AddSubDocumentMapping("Data", headerMapping)
mapping.AddDocumentMapping("header", docMapping)
mapping.TypeField = "Type"
return mapping
} When I run this program with default mapping, I get a hit:
Searching with query 'test'
Hits:
ID testdoc, Locations map[Data.Subject:map[test:[0xc420116780]]], Fields map[]
When I try with my custom mapping, I get no hit:
Searching with query 'test'
Hits:
Could someone please point me in the right direction?
Ian.