private static void matchBookNames() {

        //do simple match first
        Iterator<Desc> iter = descs.iterator();
        while (iter.hasNext()) {
            Desc desc = iter.next();
            int matchIndex = simpleNameMatch(desc.keywords);
            if (matchIndex >= 0) { //simple match succ
                matchResult.put(desc.index, matchIndex);
                iter.remove();
                removeBookname(matchIndex);
            }
        }

        //match by vote
        iter = descs.iterator();
        while (iter.hasNext()) {
            Desc desc = iter.next();
            vote(desc);;
        }
        Iterator<BookName> bnIter = booknames.iterator();
        while(bnIter.hasNext()) {
            
            BookName bn = bnIter.next();
            if(bn.maxVoteCount > 0) {
                matchResult.put(bn.maxVoteDescIndex, bn.index);
                bnIter.remove();
                removeDesc(bn.maxVoteDescIndex);
            }
        }

        //random not matched
        Random random = new Random();
        iter = descs.iterator();
        while (iter.hasNext()) {

            Desc desc = iter.next();
            matchResult
                    .put(desc.index, booknames.get(random.nextInt(100) % booknames.size()).index);
        }
    }